分支合並(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