[git]merge和rebase的區別

雖然工做中要常用git,可是也就經常使用那麼幾個命令:pull、push、status、merge、rebase,對git談不上有多熟悉,加上工做性質不多和同事協同開發,即便出現問題,頂可能是刪除項目,從新遠程拉取。前幾天在頭條看到一篇講merge和rebase的區別的文章,感受蠻不錯的,就收藏了,今天發現要用到,想從新複習下,結果提示文章被刪除了,還好在百度快照裏找到了原文,這裏作下記錄。如下是原文內容:git

前言

我從用git就一直用rebase,可是新的公司須要用merge命令,我不是很明白,因此查了一些資料,總結了下面的內容,若是有什麼不妥的地方,還望指正,我必定虛心學習。學習

merge和rebase

標題上的兩個命令:merge和rebase都是用來合併分支的。spa

這裏不解釋rebase命令,以及兩個命令的原理,詳細解釋參考這裏。(這裏的鏈接可能被百度快照吃掉了code

下面的內容主要說的是二者在實際操做中的區別。開發

什麼是分支

分支就是便於多人在同一項目中的協做開發。比方說:每一個人開發不一樣的功能,在各自的分支開發過程當中互不影響,完成後都提交到develop分支。極大的提升了開發的效率。it

合併分支

每一個人建立一個分支進行開發,當開發完成,須要合併到develop分支的時候,就須要用到合併的命令。效率

什麼是衝突

合併的時候,有可能會產生衝突。原理

衝突的產生是由於在合併的時候,不一樣分支修改了相同的位置。因此在合併的時候git不知道那個究竟是你想保留的,因此就提出疑問(衝突提醒)讓你本身手動選擇想要保留的內容,從而解決衝突。百度

merge和rebase的區別

處理衝突的方式:im

  • 使用merge命令合併分支,解決完衝突,執行git add .git commit -m'fix conflict'。這個時候會產生一個commit。
  • 使用rebase命令合併分支,解決完衝突,執行git add .git rebase --continue,不會產生額外的commit。這樣的好處是‘乾淨’,分支上不會有無心義的解決分支的commit。

git pullgit pull --rebase區別:git pull作了兩個操做分別是‘獲取’和合並。因此加了rebase就是以rebase的方式進行合併分支,默認爲merge。

以一張圖的形式merge和rebase的區別展現:

總結:個人簡單理解——merge顯性的處理衝突,rebase隱性的處理衝突。

git mergegit merge --no-ff的區別

我本身嘗試merge命令後,發現:merge時並無產生一個commit。不是說merge時會產生一個merge commit嗎?

注意:只有在衝突的時候,解決完衝突纔會自動產生一個commit。

若是想在沒有衝突的狀況下也自動生成一個commit,記錄這次合併就能夠用:git merge --no-ff命令,下面用一張圖來表示二者的區別:

 

如何選擇合併分支的方式

個人理解:主要是看那個命令用的熟練,可以有效的管理本身的代碼;還有就是團隊用的是那種方式。

我對於rebase比較熟悉,因此我通常都用rebase,可是如今的公司用的是merge --no-ff命令合併分支。因此,我在工做上就用merge,我的項目就用rebase。

也能夠二者結合:

  • 獲取遠程項目中最新代碼時:git pull --rebase,這個時隱性的合併遠程分支的代碼不會產生而外的commit。

  • 合併到分支的時候:git merge --no-ff,自動一個merge commit,便於管理(這看管理人員怎麼認爲了)

總結

  • 合併時,沒有衝突的狀況下二者同樣。(我認爲,若是理解錯了還望指正)
  • merge顯性處理衝突
  • rebase隱性處理衝突
相關文章
相關標籤/搜索