合并分支
Git合并分支有两种方式,一种是Git Merge,一种是Git Rebase。
Git Merge
Git Merge基本操作
假设存在fix和dev两个分支,现在要把fix分支合并到dev分支上。
若是在git命令行工具上操作,操作步骤如下:
1 | git checkout dev #切换分支到dev分支上 |
若是在IDEA的Git面板中操作,先把当前分支切换到dev上,然后在fix分支右键选择Merge Selected into Current即可。合并过程可能会产生冲突,需要解决完冲突才能完成合并。
Git Merge的Fast-Forward和Non Fast-Forward
一般说来,Git Merge执行之后,会在合并分支上额外产生一条“Merge branch ‘xxx’ github.com/yyy into xxx”的提交commit点,但是在Git Merge的Fast Forward(快进)模式下,是不会额外产生这条commit记录的。
(1)Fast-Forward适用场景正反例
如下图所示,bugfix分支是从master分支分叉出来的:
此时,合并bugfix分支到master分支时,如果master分支的状态没有被更改过,那么这个合并是非常简单的。bugfix分支的历史记录包含master分支所有的历史记录,所以通过把master分支的位置移动到bugfix的最新分支上,Git就会合并。这样的合并被称为Fast-Forward(快进)合并。如下:
但是,master分支的历史记录有可能在bugfix分支分叉出去后有新的更新。这种情况下,要把master分支的修改内容和bugfix分支的修改内容汇合起来。此种情形就适用不了Fast-Forward模式了。如下:
因此,合并两个修改会生成一个提交点E。这时,master分支的HEAD会移动到该提交上。如下:
(2)No Fast-Forward
执行合并时,如果设定了Non Fast-Forward选项(即git merge --no-ff
),即使在能够Fast-Forward合并的情况下也会生成新的提交并合并。
Git Merge和Git Rebase区别
Git Merge会保留分支提交信息。Git Merge会创建一次Merge branch的commit信息。相比Git Merge,Git Rebase会将分支上的commit整合到当前分支上,让整个代码周期更为清晰。相比Git Merge,Git Rebase并不会产生多余的commit信息。
在上图中,1是Git Rebase方式合并,2和3是Git Merge方式合并。
在项目实践中,选择用Git Rebase,还是Git Mrege,各有各的好处,取决于项目的规范要求。
一点闲杂
git pull默认使用merge的方式来合并代码,所以在Fast Forward不满足的情况下,git pull执行完后,将远程仓库的分支合并到本地分支上时,会在本地分支上产生一条“Merge branch xxxx”的提交记录。
学习资料参考于:
https://backlog.com/git-tutorial/cn/stepup/stepup1_4.html