圖解4種git合併分支方法

顏海鏡發表於2017-08-22

有時候我們會後悔,有時候我們會想回到過去,有時候我們想改變歷史,然而在我們這個世界,目前來看是無法回到過去改變歷史的

但在git的世界裡,一切皆有可能,我們可以在多維空間裡任意切換,隨意改變一個宇宙的時間線,只要我們願意,git的分支就是這麼神奇

然而很多時候你以為你改變了歷史,不為人知,那個宇宙並沒有消失,而是遺失在了git的世界裡,有能力的人便能找到

彼此分開的世界也能隨時交叉合併,世界就這樣開開合合,偶會需要解決合併衝突

git中的分支非常的輕量,其實就是一個檔案,裡面記錄了分支所指向的commit id,下圖中有兩個分支分別是master和test,他們都指向了A2這個提交,HEAD是一個特殊的指標,他永遠指向你當前所在的位置;有時候你可能不在某一個分支上,不要驚慌,你隨時有權利去你想去的分支,git賦予了你新建,切換分支的能力

然後有時候世界並不總如上圖那般美好,面對分叉的兩個分支,git新手總是一臉茫然,本文我將講述git中合併分支的方法

在git中合併分支有三種方法,分別是merge,rebase,cherry-pick,而其中merge又有三種區別,下面將一一介紹

fast-forward

如果待合併的分支在當前分支的下游,也就是說沒有分叉時,會發生快速合併,從test分支切換到master分支,然後合併test分支

git checkout master
git merge test

這種方法相當於直接把master分支移動到test分支所在的地方,並移動HEAD指標

no-ff

如果我們不想要快速合併,那麼我們可以強制指定為非快速合併,只需加上--no-ff引數

git checkout master
git merge –no-ff test

這種合併方法會在master分支上新建一個提交節點,從而完成合並

squash

svn的在合併分支時採用的就是這種方式,squash會在當前分支新建一個提交節點

squash和no-ff非常類似,區別只有一點不會保留對合入分支的引用

git checkout master
git merge –squash test

rebase

當要合併兩個分叉的分支時,merge的方式是將待合入分支和當前分支不同的部分,在當前分支新建節點,如下圖所示

rebase與merge不同,rebase會將合入分支上超前的節點在待合入分支上重新提交一遍,如下圖,B1 B2會變為B1' B2',看起來會變成線性歷史

cherry-pick

這命令簡直就是神器,給你自由,你想把那個節點merge過來就把那個節點merge過來,其合入的不是分支而是提交節點

總結

只有知道了這些合併方式的區別,才能git在手,天下我有,任你分支在凌亂,我自巋然不動

繼續學習

原文網址:http://yanhaijing.com/git/2017/07/14/four-method-for-git-merge/

歡迎訂閱我的微信公眾帳號,只推送原創文字。掃碼或搜尋:顏海鏡

相關文章