分支与HEAD
版本回退过程中,每次提交串成的时间线,就是一个分支,即主分支,master分支。
HEAD严格来说,指向的是master,而master指向提交。HEAD指向的就是当前分支。
创建一个新的分支、合并分支时,Git之所以这么快,主要原因就在于,移动的只是HEAD的指向。
创建与合并分支
查看当前分支,显示当前分支只有master主分支
$ git branch #查看当前分支 * master #*表示当前所在的分支
创建并切换到一个新的分支
注意:这里的checkout和之前回退的checkout区别
$ git checkout -b dev #-b参数表示:创建并切换到一个新分支 'dev' 或者 $ git branch <name> #创建一个分支
切换分支
$ git checkout <name>
创建+切换分支:
$ git checkout -b <name>
合并某分支到当前分支:需要切换到主分支,然后执行merge命令
$ git merge <name>
删除分支 //一般用到较少吧
$ git branch -d <name>
解决冲突
实际工作中遇到冲突的可能性还是比较大的,如果主分支和其他分支,都对一行代码或者文字,进行了修改提交。那么在合并时,就是出现冲突。如下:
提示自动合并失败,需要手动解决冲突,此时查看该文件,会有如上对比
- <<<<<<为master分支的内容
- >>>>>>为feature1分支的内容
- 中间以=====进行分割
此时分支的解决办法,就是直接打开冲突文件修改后git add 并且commit,现在分支变为如下状态:
也可以通过如下方式查看变化轨迹
最后,删除feature1分支
$ git branch -d feature1
已删除分支 feature1(曾为 491ec71)。
分支管理策略
通常合并分支,Git默认使用fast forward模式,但是这种模式,删除分之后,会丢掉分支信息
强制禁用fast forward模式,Git就会在merge时生成一个新的commit。
$ git merge --no-ff -m "merge with no-ff" dev
合并后,我们用git log看看分支历史:
$ git log --graph --pretty=oneline --abbrev-commit * 7825a50 merge with no-ff | | * 6224937 add merge |/ * 59bc1cb conflict fixed ...
分支策略 干货!!!
实际开发中,我们应该按照几个基本原则进行分支管理
- master分支非常稳定,仅用来发布稳定版本,平时不在上面干活
- 干活都在dev分支上,也就是说,dev分支是不稳定的,到某个时候,比如1.0版本发布时,再把dev分支合并到master上,在master分支发布1.0版本;
- 每个人都在dev分支上干活,每个人都有自己的分支,时不时地往dev分支上合并就可以了
廖总教程里有一个仁兄的回复,很有意义,截图如下: