1. 程式人生 > >Git:merge和rebase區別

Git:merge和rebase區別

前言

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

merge和rebase

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

這裡不解釋rebase命令,以及兩個命令的原理,詳細解釋參考這裡

下面的內容主要說的是兩者在實際操作中的區別。

什麼是分支

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

合併分支

每個人建立一個分支進行開發,當開發完成,需要合併到develop分支的時候,就需要用到合併

的命令。

什麼是衝突

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

衝突的產生是因為在合併的時候,不同分支修改了相同的位置。所以在合併的時候git不知道那個到底是你想保留的,所以就提出疑問(衝突提醒)讓你自己手動選擇想要保留的內容,從而解決衝突。

merge和rebase的區別

  1. 採用merge和rebase後,git log的區別,merge命令不會保留merge的分支的commit

  2. 處理衝突的方式:
    • (一股腦)使用merge命令合併分支,解決完衝突,執行git add .git commit -m'fix conflict'。這個時候會產生一個commit。
    • (互動式)使用rebase命令合併分支,解決完衝突,執行git add .git rebase --continue,不會產生額外的commit。這樣的好處是,‘乾淨’,分支上不會有無意義的解決分支的commit;壞處,如果合併的分支中存在多個commit,需要重複處理多次衝突。
  3. git pullgit 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,便於管理(這看管理人員怎麼認為了)