圖解4種git合并分支方法
有時候我們會后悔,有時候我們會想回到過去,有時候我們想改變歷史,然而在我們這個世界,目前來看是無法回到過去改變歷史的
但在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在手,天下我有,任你分支在凌亂,我自巋然不動
繼續學習
- 起底Git-開篇
- 起底Git-版本控制簡史
- 起底Git-Git簡史
- 起底Git-Git內部原理
- 起底Git-Git基礎
- 起底Git-Git進階
- 起底Git-Git開發流程
- 起底Git-Git常用命令總結
來自: http://yanhaijing.com/git/2017/07/14/four-method-for-git-merge/