赞
踩
目录
5 解决指点文件不受.gitignore规则管理,即:排除在外
下载地址: Git - Downloads
安装完成后,回到桌面右键,显示下面内容表示安装成功
安装完成后,还需要最后一步设置,在命令行输入:
鼠标右键点击桌面打开Git bash Here
分别输入:
- $ git config --global user.name "you_name"
- $ git config --global user.email "xxx...ccc@qq.com"
注:
在合适的地方,创建一个空目录
鼠标右键点击桌面打开Git Bash Here
通过git init命令把这个目录变成Git可以管理的仓库:
$ git init
看到.git目录,表示初始化仓库成功,如果你没有看到.git目录,那是因为这个目录默认是隐藏的,用ls -ah命令就可以看见。
把一个文件放到Git仓库需要两步。
在仓库目录下创建一个文件readme.txt,并随意填写一些内容进去
也可以直接在Git Bash里使用命令创建文件
touch 文件名.txt
第一步,用命令git add告诉Git,把文件添加到仓库:
也可以直接使用git add . 表示提交所以的文件到仓库暂存区
- $ git add readme.txt
- //表示提交所以的文件到仓库暂存区
- $ git add .
第二步,用命令git commit告诉Git,把文件提交到仓库:
$ git commit -m "wrote a readme file"
简单解释一下git commit命令,-m后面输入的是本次提交的说明,可以输入任意内容,当然最好是有意义的,这样你就能从历史记录里方便地找到改动记录。
常看git仓库提价状态
查看git的提交日志
git reset --hard commitID
commitID:表示需要回退到的版本的Id;
commitID可以使用:
- git reflog
- 或
- git log
进行查询版本id
也可以使用:
$ git reset --hard HEAD^
进行回退;
在Git中,用HEAD表示当前版本,上一个版本就是HEAD^,上上一个版本就是HEAD^^,当然往上100个版本写100个^比较容易数不过来,所以写成HEAD~100。
在Git目录下创建一个.gitignore文件,在里面进行指定即可:
.gitignore文件内容为:*a
命令:git diff 文件名
$ git checkout -- 文件名
如:$ git checkout -- readme.txt
命令git checkout -- readme.txt意思就是,把readme.txt文件在工作区的修改全部撤销,这里有两种情况:
总之,就是让这个文件回到最近一次git commit或git add时的状态。
$ git reset HEAD 文件名
假定是凌晨3点,你不但写了一些胡话,还git add到暂存区了:
那怎么将提交到暂存区的修改进行撤销呢?
命令git reset HEAD 文件名可以把暂存区的修改撤销掉(unstage),重新放回到工作区中;
git reset命令既可以回退版本,也可以把暂存区的修改回退到工作区。当我们用HEAD时,表示最新的版本。
再用git status查看一下,暂存区就是干净的了
一般情况下,你可以直接在文件位置将没用的文件删除,或者用rm命令删了:
$ rm 文件名
这个时候,Git知道你删除了文件,因此,工作区和版本库就不一致了,git status命令会立刻告诉你哪些文件被删除了:
现在你有两个选择:
一、是确实要从版本库中删除该文件,那就用命令git rm删掉,并且git commit:
- $ git rm 文件名
- //===================
- git commit -m '操作注释'
二、另一种情况是误删了,因为版本库里还有,所以可以很轻松地把误删的文件恢复到最新版本:
$ git checkout -- 文件名
git checkout其实是用版本库里的版本替换工作区的版本,无论工作区是修改还是删除,都可以“一键还原”。
但是注意,修改了内容没有提交到版本库,恢复的文件是只是版本库里的最新内容。
命令:git branch
命令:git branch 分支名
$ git switch -c 新分支名称
$ git switch 分支名
$ git checkout -b 新分支名称
$ git checkout 分支名
用于合并别的分支到自己分支
git merge 分支名称
$ git merge --no-ff -m "info" dev
info:描述信息
dev:被合并的分支名称
注:合并分支时,加上--no-ff参数就可以用普通模式合并,合并后的历史有分支,能看出来曾经做过合并,而fast forward合并就看不出来曾经做过合并。
不能删除当前分支,只能删除其他分支
- git branch -d 分支名称 //删除分支时,需要做各种检查
- git branch -D 分支名称 //不做任何检查,强制删除
当两个分支上对文件的修改可能会存在冲突,例如同时修改了同一个文件的同一行,这时就需要手动解决冲突,解决冲突步骤如下:
Git鼓励大量使用分支:
在Git中,由于分支是如此的强大,所以,每个bug都可以通过一个新的临时分支来修复,修复后,合并分支,然后将临时分支删除。
在master分支下创建一个修复bug的分支bug01,并切换到bug01分支
$ git checkout -b bug01
- //添加到暂存区
- $ git add bug文件名
- //提交到仓库
- $ git commit -m "bug描述"
$ git switch master
$ git merge --no-ff -m "描述bug" bug01
在master分支上修复了bug后,我们要想一想,dev分支是早期从master分支分出来的,所以,这个bug其实在当前dev分支上也存在。
那怎么在dev分支上修复同样的bug?重复操作一次,提交不就行了?
为了方便操作,Git专门提供了一个cherry-pick命令,让我们能复制一个特定的提交到当前分支:
$ git cherry-pick 4c805e2
4c805e2:提交操作的id
(1)先得到commitid
$ git log --graph --pretty=oneline --abbrev-commit
(2)执行cherry-pick,进行复制合并,修复bug
$ git cherry-pick 4b24b3a
(3)修复bug成功,查看日志
$ git log --graph --pretty=oneline --abbrev-commit
Git自动给dev分支做了一次提交,注意这次提交的commit是c2a9ebc,它并不同于master的4b24b3a,因为这两个commit只是改动相同,但确实是两个不同的commit。用git cherry-pick,我们就不需要在dev分支上手动再把修bug的过程重复一遍。
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场;
在master分支上修复的bug,想要合并到当前dev分支,可以用git cherry-pick <commit>命令,把bug提交的修改“复制”到当前分支,避免重复劳动。
在Git中打标签非常简单,首先,切换到需要打标签的分支上:
然后,敲命令git tag <name>就可以打一个新标签:
$ git tag v1.0
v1.0:标签名
$ git tag v0.9 f52c633
v0.9:标签名
f52c633:commit id
创建带有说明的标签,用-a指定标签名,-m指定说明文字:
$ git tag -a v0.1 -m "version 0.1 released" 1094adb
1094adb:commit id,可以不填写,不写表示在当前分支进行添加标签
$ git tag
标签不是按时间顺序列出,而是按字母排序的。可以用git show <tagname>查看标签信息:
$ git show v0.9
v0.9:标签名
注:命令git show <tagname>也可以看到标签的说明文字
$ git tag -d v0.1
v0.1:标签名
因为创建的标签都只存储在本地,不会自动推送到远程。所以,打错的标签可以在本地安全删除。
如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除
$ git tag -d v0.9
然后,从远程删除。删除命令也是push,但是格式如下:
$ git push origin :refs/tags/v0.9
$ git push origin v1.0
$ git push origin --tags
Git显示颜色,会让命令输出看起来更醒目:
$ git config --global color.ui true
[参考本笔记](#5 指定哪些文件不需要Git进行管理)
有些时候,你必须把某些文件放到Git工作目录中,但又不能提交它们,比如保存了数据库密码的配置文件啦,等等,每次git status都会显示Untracked files ...,有强迫症的童鞋心里肯定不爽。
好在Git考虑到了大家的感受,这个问题解决起来也很简单,在Git工作区的根目录下创建一个特殊的.gitignore文件,然后把要忽略的文件名填进去,Git就会自动忽略这些文件。
不需要从头写.gitignore文件,GitHub已经为我们准备了各种配置文件,只需要组合一下就可以使用了。所有配置文件可以直接在线浏览:https://github.com/github/gitignore
忽略文件的原则是:
最后一步就是把.gitignore也提交到Git,就完成了!
有些时候,你想添加一个文件到Git,但发现添加不了,原因是这个文件被.gitignore忽略了:
如果你确实想添加该文件,可以用-f强制添加到Git:
$ git add -f 文件名
有时候.gitignore写得可能有问题,需要找出来到底哪个规则写错了,可以用git check-ignore命令检查指定的文件规则问题:
$ git check-ignore -v 文件名
还有些时候,当我们编写了规则排除了部分文件时;
我们发现.*这个规则把.gitignore也排除了,并且App.class需要被添加到版本库,但是被*.class规则排除了。
虽然可以用git add -f强制添加进去,但有强迫症的童鞋还是希望不要破坏.gitignore规则,这个时候,可以添加两条例外规则:
如下:
- # 排除所有.开头的隐藏文件:
- .*
- # 排除所有.class文件:
- *.class
-
- # 不排除.gitignore和App.class:
- !.gitignore
- !App.class
把指定文件排除在.gitignore规则外的写法:
就是!+文件名,所以,只需把例外文件添加进去即可。
有没有经常敲错命令?比如git status?status这个单词真心不好记。
如果敲git st就表示git status那就简单多了,当然这种偷懒的办法我们是极力赞成的。
我们只需要敲一行命令,告诉Git,以后st就表示status:
$ git config --global alias.st status
当然还有别的命令可以简写,很多人都用co表示checkout,ci表示commit,br表示branch:
- $ git config --global alias.co checkout
- $ git config --global alias.ci commit
- $ git config --global alias.br branch
注:--global参数是全局参数,也就是这些命令在这台电脑的所有Git仓库下都有用。
配置一个git last,让其显示最后一次提交信息:
$ git config --global alias.last 'log -1'
甚至还有人丧心病狂地把lg配置成了:
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
配置Git的时候,加上--global是针对当前用户起作用的,如果不加,那只针对当前的仓库起作用。
配置文件放哪了?
每个仓库的Git配置文件都放在.git/config文件中:
别名就在[alias]后面,要删除别名,直接把对应的行删掉即可。
住:而当前用户的Git配置文件放在用户主目录下的一个隐藏文件.gitconfig中:
配置别名也可以直接修改这个文件,如果改错了,可以删掉文件重新通过命令配置。
有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。
部分windows系统不允许用户创建点号开头的文件,可以打开gitBash,执行 touch ~/.bashrc
touch ~/.bashrc :表示用户根目录下创建.bashrc文件
也可指点创建的位置:如:touch~/git/.bashrc
如:
- #用于输出git提交日志
- alias git-log='git log --pretty=oneline --all --graph --abbrev-commit'
- #用于输出当前目录所有文件及基本信息
- alias ll='ls -al'
source ~/.bashrc
目前用不到,后期打算
这里我们推荐SourceTree
常用:
- $ git log --graph --pretty=oneline --abbrev-commit
- 或
- $ git log --pretty=oneline --all --graph --abbrev-commit
git config user.name
git config user.email
git config --global user.name "用户名"
git config --global user.email "邮箱"
如果git pull提示no tracking information,则说明本地分支和远程分支的链接关系没有创建,用命令git branch --set-upstream-to <branch-name> origin/<branch-name>。
命令:
$ git branch --set-upstream-to=origin/dev dev
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。