轉(zhuǎn)自: http://www.cnblogs.com/xueweihan/p/5743327.html
前言
我從用git就一直用rebase举瑰,但是新的公司需要用merge命令,我不是很明白换况,所以查了一些資料,總結(jié)了下面的內(nèi)容盗蟆,如果有什么不妥的地方戈二,還望指正,我一定虛心學(xué)習(xí)姆涩。
merge和rebase
標(biāo)題上的兩個(gè)命令:merge和rebase都是用來合并分支的挽拂。
這里不解釋rebase命令,以及兩個(gè)命令的原理骨饿,詳細(xì)解釋參考這里亏栈。
下面的內(nèi)容主要說的是兩者在實(shí)際操作中的區(qū)別。
什么是分支
分支就是便于多人在同一項(xiàng)目中的協(xié)作開發(fā)宏赘。比方說:每個(gè)人開發(fā)不同的功能绒北,在各自的分支開發(fā)過程中互不影響,完成后都提交到develop分支察署。極大的提高了開發(fā)的效率闷游。
合并分支
每個(gè)人創(chuàng)建一個(gè)分支進(jìn)行開發(fā),當(dāng)開發(fā)完成贴汪,需要合并到develop分支的時(shí)候脐往,就需要用到合并的命令。
什么是沖突
合并的時(shí)候扳埂,有可能會(huì)產(chǎn)生沖突业簿。
沖突的產(chǎn)生是因?yàn)樵诤喜⒌臅r(shí)候,不同分支修改了相同的位置阳懂。所以在合并的時(shí)候git不知道那個(gè)到底是你想保留的梅尤,所以就提出疑問(沖突提醒)讓你自己手動(dòng)選擇想要保留的內(nèi)容柜思,從而解決沖突。
merge和rebase的區(qū)別
采用merge和rebase后巷燥,git log的區(qū)別赡盘,merge命令不會(huì)保留merge的分支的commit:
處理沖突的方式:(一股腦)使用merge
命令合并分支,解決完沖突缰揪,執(zhí)行g(shù)it add .
和git commit -m'fix conflict'
陨享。這個(gè)時(shí)候會(huì)產(chǎn)生一個(gè)commit。
(交互式)使用rebase
命令合并分支邀跃,解決完沖突霉咨,執(zhí)行g(shù)it add .
和git rebase --continue
,不會(huì)產(chǎn)生額外的commit拍屑。這樣的好處是途戒,‘干凈’,分支上不會(huì)有無意義的解決分支的commit僵驰;壞處喷斋,如果合并的分支中存在多個(gè)commit
,需要重復(fù)處理多次沖突蒜茴。
git pull
和git pull --rebase
區(qū)別:git pull
做了兩個(gè)操作分別是‘獲取’和合并星爪。所以加了rebase就是以rebase的方式進(jìn)行合并分支,默認(rèn)為merge粉私。
git merge
和 git merge --no-ff
的區(qū)別
1顽腾、我自己嘗試merge
命令后,發(fā)現(xiàn):merge時(shí)并沒有產(chǎn)生一個(gè)commit诺核。不是說merge時(shí)會(huì)產(chǎn)生一個(gè)merge commit嗎抄肖?
注意:只有在沖突的時(shí)候,解決完沖突才會(huì)自動(dòng)產(chǎn)生一個(gè)commit窖杀。
如果想在沒有沖突的情況下也自動(dòng)生成一個(gè)commit漓摩,記錄此次合并就可以用:git merge --no-ff
命令,下面用一張圖來表示兩者的區(qū)別:
2入客、如果不加 --no-ff 則被合并的分支之前的commit都會(huì)被抹去管毙,只會(huì)保留一個(gè)解決沖突后的 merge commit。
如何選擇合并分支的方式
我的理解:主要是看那個(gè)命令用的熟練桌硫,能夠有效的管理自己的代碼夭咬;還有就是團(tuán)隊(duì)用的是那種方式。
我對(duì)于rebase比較熟悉铆隘,所以我一般都用rebase
皱埠,但是現(xiàn)在的公司用的是merge --no-ff
命令合并分支。所以咖驮,我在工作上就用merge边器,個(gè)人項(xiàng)目就用rebase。
也可以兩者結(jié)合:
獲取遠(yuǎn)程項(xiàng)目中最新代碼時(shí):git pull --rebase
托修,這個(gè)時(shí)隱性的合并遠(yuǎn)程分支的代碼不會(huì)產(chǎn)生而外的commit(但是如果存在沖突的commit太多就像上面說的忘巧,需要處理很多遍沖突)。
合并到分支的時(shí)候:git merge --no-ff
睦刃,自動(dòng)一個(gè)merge commit砚嘴,便于管理(這看管理人員怎么認(rèn)為了)
總結(jié)
看懂上面的兩幅圖就行了。
commit log的區(qū)別
處理沖突的方式
參考
Git Book
StackoverFlow:difference between merge and merge --no-ff ?
Source Tree Blog
Yu-Cheng Chuang’s Blog
分類: git