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:
image -
處理沖突的方式:
- (一股腦)使用
merge
命令合并分支,解決完沖突,執(zhí)行git add .
和git commit -m'fix conflict'
。這個(gè)時(shí)候會(huì)產(chǎn)生一個(gè)commit。 - (交互式)使用
rebase
命令合并分支,解決完沖突,執(zhí)行git 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ū)別
- 處理沖突的方式