轉自: http://www.cnblogs.com/xueweihan/p/5743327.html
前言
我從用git就一直用rebase,但是新的公司需要用merge命令,我不是很明白,所以查了一些資料,總結了下面的內容,如果有什么不妥的地方,還望指正,我一定虛心學習。
merge和rebase
標題上的兩個命令:merge和rebase都是用來合并分支的。
這里不解釋rebase命令,以及兩個命令的原理,詳細解釋參考這里。
下面的內容主要說的是兩者在實際操作中的區別。
什么是分支
分支就是便于多人在同一項目中的協作開發。比方說:每個人開發不同的功能,在各自的分支開發過程中互不影響,完成后都提交到develop分支。極大的提高了開發的效率。
合并分支
每個人創建一個分支進行開發,當開發完成,需要合并到develop分支的時候,就需要用到合并的命令。
什么是沖突
合并的時候,有可能會產生沖突。
沖突的產生是因為在合并的時候,不同分支修改了相同的位置。所以在合并的時候git不知道那個到底是你想保留的,所以就提出疑問(沖突提醒)讓你自己手動選擇想要保留的內容,從而解決沖突。
merge和rebase的區別
采用merge和rebase后,git log的區別,merge命令不會保留merge的分支的commit:
處理沖突的方式:(一股腦)使用merge
命令合并分支,解決完沖突,執行git add .
和git commit -m'fix conflict'
。這個時候會產生一個commit。
(交互式)使用rebase
命令合并分支,解決完沖突,執行git add .
和git rebase --continue
,不會產生額外的commit。這樣的好處是,‘干凈’,分支上不會有無意義的解決分支的commit;壞處,如果合并的分支中存在多個commit
,需要重復處理多次沖突。
git pull
和git pull --rebase
區別:git pull
做了兩個操作分別是‘獲取’和合并。所以加了rebase就是以rebase的方式進行合并分支,默認為merge。
git merge
和 git merge --no-ff
的區別
1、我自己嘗試merge
命令后,發現:merge時并沒有產生一個commit。不是說merge時會產生一個merge commit嗎?
注意:只有在沖突的時候,解決完沖突才會自動產生一個commit。
如果想在沒有沖突的情況下也自動生成一個commit,記錄此次合并就可以用:git merge --no-ff
命令,下面用一張圖來表示兩者的區別:
2、如果不加 --no-ff 則被合并的分支之前的commit都會被抹去,只會保留一個解決沖突后的 merge commit。
如何選擇合并分支的方式
我的理解:主要是看那個命令用的熟練,能夠有效的管理自己的代碼;還有就是團隊用的是那種方式。
我對于rebase比較熟悉,所以我一般都用rebase
,但是現在的公司用的是merge --no-ff
命令合并分支。所以,我在工作上就用merge,個人項目就用rebase。
也可以兩者結合:
獲取遠程項目中最新代碼時:git pull --rebase
,這個時隱性的合并遠程分支的代碼不會產生而外的commit(但是如果存在沖突的commit太多就像上面說的,需要處理很多遍沖突)。
合并到分支的時候:git merge --no-ff
,自動一個merge commit,便于管理(這看管理人員怎么認為了)
總結
看懂上面的兩幅圖就行了。
commit log的區別
處理沖突的方式
參考
Git Book
StackoverFlow:difference between merge and merge --no-ff ?
Source Tree Blog
Yu-Cheng Chuang’s Blog
分類: git