当执行git merge的命令的时候,工作的顺序如下:
- 判断是否可以fast-forward,如果可以直接fast-forward并结束流程,如果不能执行第2步。
- 不能fast-forward的话,需要执行三方合并。
1 判断是否可以fast-forward
整体的判断规则是,如果当前分支所在的commit节点是被合入的分支所在commit节点的直接祖先,那执行git merge
可以直接把当前分支前进到被合入分支所在commit节点。
下面是几个不同情况的例子:
- 如下图,iss53分支所在commit节点是master分支所在commit节点的直接子孙,在master分支执行
git merge iss53
可以直接把master分支fast-forward到iss53所在commit节点
- 如下图,hotfix分支和iss53分支所在commit节点都是master分支所在commit节点的子孙,执行
git merge hotfix
或git merge iss53
可以直接把master分支fast-forward到hotfix分支或iss53分支所在的commit节点
- 如下图,master分支所在commit节点是iss53分支所在commit节点的直接子孙,在iss53分支执行
git merge master
时会直接将iss53分支fast-forward到master所在的commit节点。
2 三方合并的过程
如图所示,当在master分支执行git merge iss53
时,并不能直接fast-forward,那么git会选择master分支所在的commit节点C4
、iss53分支所在的commit节点C5
以及两者最近的共同祖先C2
做三方合并:
- 找到
C2
、C4
和C5
三个节点都相同的文件作为新的节点的一部分文件快照 - 在剩下的文件中找到 被
C4
修改而没有被C5
修改的文件 和 被C5
修改而没有被C4
修改的文件 作为新的节点的一部分文件快照 - 剩下的文件快照是即被
C4
修改又被C5
修改的文件- 如果两个节点修改的位置不同,将两者的修改都放入文件作为新的节点的文件快照
- 如果两个节点修改的位置相同,那么会产生冲突,由用户自己处理冲突后作为新的节点的文件快照