分布式版本控制系统Git学习笔记,建议学习之前先了解一下常见linux命令。
学习教程:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
参考资料:http://lib.csdn.net/base/git
分支管理
git中由历史提交记录组成的一条时间线叫做一条分支,我们使用git时程序默认给我们建立了一条叫做master的分支,HEAD是指向当前分支当前提交点的指针。通过将HEAD指向不同提交点就能确定当前处于哪个分支,哪个提交点。
一、分支的创建与合并
使用命令git branch <分支名>
创建一条分支,使用git checkout <分支名>
切换到创建的分支。也可以使用git checkout -b <分支名>
创建分支并切换到该分支。
命令git branch
可查看所有分支,在当前分支前面会有一个 *
。
当你使用git checkout <分支名>
切换分支后,以后的所有提交都会在这个分支上创建节点。而在此分支上做出的修改是不会影响其他分支的。如果需要将当前分支的修改在其他分支上也体现出来,那么就需要合并分支。
使用git merge <分支名>
将目标分支合并到当前分支。分支合并以后,当前分支与目标分支的最新内容就一样了,我们可以删去目标分支,使用git branch -d <分支名>
。
如果某个分支的开发被取消了,也就是无需再将之合并到更高层的分支中去,此时需要强制删除分支,使用参数-D
,命令git branch -D <分支名>
强制删除分支。
假如我们的新分支与原来的分支都有提交,那么git会尝试将两个分支的修改合并,如果修改有冲突,则会提示你某个文件存在冲突,需要手动作出合并。此时打开有冲突的文件就能够看到git将两个分支中冲突的修改标记出来了。你需要解决冲突然后重新提交。这样就合并完成了。
使用命令git log --graph --pretty=oneline --abbrev-commit
可以直观的看到提交的图示。
合并分支时,git通常会使用Fast forward模式,此模式下合并后删除分支将会丢失分支的记录(也就是分支提交被融入到合并的分支里了)。如果要保留分支的记录,则在合并分支时使用--no-ff
参数,使用此参数会在合并时创建又一次新的提交,所以需要加上提交信息,最终命令
git merge --no-ff -m "<提交信息>" <目标分支>
二、开发中常用分支
- master分支是仓库默认为我们建立的一个主分支,通常用来发布新版本,应该保持稳定。
- dev分支是用于工作的分支,参与工作的人需要从上面创建自己的分支进行工作,并时不时向dev分支上合并修改内容即可。
- BUG分支用于临时解决某些突发BUG。
- Feature分支用于开发某一新的功能。
三、暂存工作现场
有时候我们在某个工作进行到一半时时,临时需要去完成一项更加紧迫的工作,但是原来的工作还没做完,不适合提交,就可以将当前工作现场进行暂存,然后再建立新的分支去完成这项紧急任务,任务结束后再将工作现场恢复继续之前的工作。
暂存工作现场的命令:git stash
查看存储的工作现场:git stash list
恢复工作现场:git stash apply <工作现场编号>
恢复最近的工作现场并删除记录:git stash pop
删除记录的工作现场:git stash drop <工作现场编号>
四、多人协作
前面说了,我们通常git仓库置于远程服务器上,然后协作者克隆到本地进行工作,完成工作以后再将本地修改推送到远程仓库。
查看远程仓库信息:git remote
。加参数-v
显示详细信息
推送分支:git push <远程仓库名称> <本地分支>
通常我们需要把master分支和dev分支推送到远程,供队友协作。
将本地分支与远程分支关联:git branch --set-upstream <本地分支名> <远程仓库名称>/<远程分支>
克隆远程库:git clone <远程仓库地址>
注意:克隆过来的远程库默认只有master分支,本地需要自己创建一个dev开发分支进行工作。
有时候远程分支的内容会比本地分支的内容新,这有可能会导致你的推送失败,这时需要使用命令git pull
抓取远程分支的新提交,本地合并解决冲突再推送。
五、标签
一般来说,commit自动生成的版本号并不好记,不便于使用,所以git引入了标签(tag),标签是指向某个版本的快照,固定的指向某个commit。
使用命令git tag <tag名> [版本号]
为当前分支某节点打上标签,缺省版本号参数则为当前分支当前节点打标签。
使用命令git tag -a <tag名> -m "说明文字" [版本号]
创建带说明的标签。
使用git tag
查看所有标签。
使用git show <tag名>
可查看标签的详细信息。
不小心打错标签的话,使用git tag -d <tag名>
删除。
将标签推送到远程库使用git push <远程库名称> <tag名>
或者将全部标签推送到远程git push <远程库名称> --tags
删除远程库的标签:先删除本地标签,然后使用git push <远程库名称>:refs/tags/<标签名>
自定义git
一、忽略特殊文件
有些文件我们并不想把它添加到版本库中,比如系统生成的配置文件,存放口令的配置文件,编译生成的文件。此时需要创建一个.gitignore
文件,并将过滤规则写在其中。
比如:
#windows 注释说明
Thumbs.db #忽略文件
Desktop.ini
#Java
*.class
#my config
db.ini
Github为我们提供了各种模板,参考https://github.com/github/gitignore
做好配置文件以后我们将.gitignore添加到库再推送到远程库即可。
使用git add -f <文件名>
强制添加到git。
使用git check-ignore -v <文件名>
检查哪条过滤规则过滤了该文件。
二、偷个懒,简化命令
使用
git config [--global] alias.<别名> <命令>
简化命令,比如使用git config --global alias.st status
后,就可以使用简化后的,命令git st
查看库状态了。
还有常用的其它简写:
co -- checkout
ci -- commit
br -- branch
另外一些简写配置:
$git config --global alias.unstage 'reset Head'
这样就能使用 git unstage <filename>撤销暂存区修改了
$git config --global alias.last 'log -l'
使用 git last查看最近一次提交
如何删除简写呢,前面说过–global参数是全局设置,对当前用户在本机器上创建的所有库通用,我们可以在用户主目录下找到.gitconfig
文件(通常在C:\User\用户名\
路径下),删除[alias]
下对应的项目即可。
如果你没有用–global参数,则在当前仓库的.git
目录下找config
文件执行上述操作。