分支合并(fast-forward 、三方合并、变基操作)
git checkout master //切换到master分支 git merge hotfix //将hotfix分支上的修改合并到master分支上
如上图,由于master分支所指向的提交时你当前提交(有关hotfix的提交)的直接上游,所以git只是简单的将指针向前移动。换句话说,当试图合并master分支与hotfix分支时,如果顺着一个个分支走下去能够到达另一个分支,那么git在合并两者的时候,只会简单的将指针向前推进(指针右移),因为这种情况下的合并操作并没有需要解决的分歧--这就叫做快进(fast-forward)。
除了上面的fast-forward情况,还有一种常见的就是三方合并
fastforward合并的情况是两个分支所指向的提交时直接祖先,而三方合并(如上图)master分支与iss53分支所指向的提交并没有直接祖先,但它们都指向一个共同祖先C2,此时可利用两个分支的末端所指向的快照(C4和C5)以及两个分支的共同祖先(C2),做个简单的三方合并,三方合并的结果是做一个新的快照并且自动创建一个新的提交指向它(如下图)。这个称为一次合并提交。
变基操作,如此时要合并下图中的master分支和experiment分支,除了使用上述介绍的三方合并的方式,还可以采用变基的方式,即提取在C4中引入的补丁和修改,然后再C3的基础上应用一次,这种操作叫做变基,我们可以使用rebase命令将提交到某一分支上的所有修改都移到另一个分支上,就好像重新播放一样:
命令:
git checkout experiment git rebase master
它的原理是:首先找到这两个分支(即当前分支expriment。变基操作的目标基底分支master)的最近共同祖先C2,然后对比当前分支相对于该祖先的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底C3,最后以此将之前另存为临时文件的修改依序应用
然后回到master分支,进行以此快进合并
git checkout master git merge experiment