概念
git merge 和 git rebase 是使用率非常高的兩條指令
本文對git merge的日常使用場景做一個梳理匆绣,git rebase請看 Git自學成才——rebase完整版
假設我有一個開發(fā)分支dev牙肝,有一個主干分支master
關于哪個分支合并到哪個分支级及,很多人會有混淆和困惑英上。其實韩脏,你需要往哪個分支上面合并疚漆,就要切換到哪個分支
比如夭苗,現(xiàn)在要 把dev分支merge到master分支
首先翼悴,保證兩個分支都是最新的狀態(tài)
切換到master分支缚够,執(zhí)行merge操作
git checkout master
git merge dev
git merge
命令用于合并指定分支到當前分支
基礎
上面是最基本的git merge幔妨,git merge默認采用快進(fast-forward)的方式,產(chǎn)生類似如下的log
Updating f42c576..3a0874c
Fast-forward
index.html | 2 ++
何為 快進(Fast-forward)谍椅?
在合并的時候误堡,你應該注意到了"快進(fast-forward)"這個詞。 由于當前 master 分支所指向的提交是你當前提交(有關 hotfix 的提交)的直接上游雏吭,所以 Git 只是簡單的將指針向前移動锁施。 換句話說,當你試圖合并兩個分支時杖们,如果順著一個分支走下去能夠到達另一個分支悉抵,那么 Git 在合并兩者的時候,只會簡單的將指針向前推進(指針右移)摘完,因為這種情況下的合并操作沒有需要解決的分歧——這就叫做 “快進(fast-forward)”姥饰。
如果merge的時候沒有沖突,沒有新的commit節(jié)點產(chǎn)生孝治,只是移動分支的指針列粪,來實現(xiàn)merge
如果merge的時候有沖突,產(chǎn)生類似如下的log
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.
需要手動解決沖突荆秦,然后執(zhí)行add篱竭,再commit
git add index.html
git commit -m "conflict fixed Your message..."
實戰(zhàn)
基本知識了解完,來看一下實戰(zhàn)中的三種操作
無節(jié)點merge
很多公司或者組織會大量使用分支步绸,他們不喜歡在master分支看到錯綜復雜的merge節(jié)點掺逼,所以他們的要求是無節(jié)點的merge(看起來所有的commit都是一條直線),這樣的視覺效果清晰可讀性很強瓤介。
實現(xiàn)無節(jié)點merge吕喘,其實是用到merge指令的默認特性——快進(Fast-forward),因為快進方式的merge不會產(chǎn)生節(jié)點刑桑,只會移動分支的HEAD指針氯质。
問題是,快進的特性是在沒有沖突的情況下產(chǎn)生祠斧,而執(zhí)行merge大概率的情況會有很多沖突闻察。這里搭配rebase變基操作更加合適,具體的rebase操作請看 Git自學成才——rebase完整版
完成rebase操作之后琢锋,在master分支上執(zhí)行
git merge dev
...
Fast-forward
...
你會在SourceTree里看看master分支已經(jīng)包含了dev分支的commit辕漂,并且是一條直線
有節(jié)點merge
另外一些情況,被要求所有的merge操作必須要保留節(jié)點
如果merge有沖突吴超,手動解決完沖突后钉嘹,add 沖突的文件,再commit鲸阻,這樣已經(jīng)產(chǎn)生了一個merge節(jié)點跋涣。
如果要求強制產(chǎn)生merge節(jié)點缨睡,使用 --no-ff
參數(shù)告訴merge,我們不需要快進(no-ff : no fast forward)
git merge --no-ff -m "merged dev" dev
這樣會產(chǎn)生一個 “merged dev” 的commit節(jié)點
單節(jié)點merge
在某些情況下陈辱,需要我們的merge只產(chǎn)生一個commit節(jié)點
這時奖年,我們需要壓扁參數(shù)squash(可以理解為壓縮提交),squash和no-ff非常類似沛贪,區(qū)別是不會保留對合入分支的引用拾并。也就是說,squash把dev分支的代碼壓縮在一起鹏浅,在master分支只提交一次。
git merge --squash dev
git commit –m "squash dev"
這樣的操作會在你的master分支上只產(chǎn)生一個"squash dev"節(jié)點(包含了dev分支上的多個commit內(nèi)容)
以上三種merge方式基本涵蓋了日常實戰(zhàn)的場景屏歹,一圖以蔽之
更多內(nèi)容請參考官方手冊
Git 分支 - 分支的新建與合并
git-merge