『 merge --ff』 VS 『 merge --no-ff 』 VS『 rebase 』

在合并分支時(如合并develop分支到master分支),我們可以有以下命令的選擇:

  • git merge // 等同于 git merge --ff
  • git merge --no-ff
  • git rebase

那么,這三者之間有哪些區(qū)別呢?對此,我將會通過下面的實驗進行比較說明:

分支合并實驗說明圖.png

實驗說明

在日常開發(fā)中,合并的兩個分支(下面將會以日常用到的master分支和develop分支這2個分支進行舉例),存在這2個情形:

  • master分支和develop分支無分叉:只有develop分支有更新
  • master分支和develop分支有分叉:兩個分支均有更新

接下來的實驗就是:分別在這兩個情形下,分別通過 git merge --ff 、git merge --no-ff 、git rebase 命令把develop分支合并到master分支,然后比較合并后的master的commit-tree。

merge --ff 、merge --no-ff 、rebase 各自合并的步驟如下:

  • 使用 merge --ff合并的步驟

    git checkout master
    git merge develop  // 等同 git merge --ff develop
    
  • 使用 merge --no-ff 合并的步驟

    git checkout master
    git merge --no-ff develop
    
  • 使用 rebase 合并的步驟

    git checkout develop
    git rebase master
    git checkout master
    git merge develop
    

實驗結(jié)果

分支無分叉的場景下:

合并前:

合并前.png

分別執(zhí)行merge/rebase后的情況對比:

  • 應(yīng)用git merge --ff
merge-ff.png
  • 應(yīng)用git merge --no-ff
merge-no-ff.png
  • 應(yīng)用git rebase
rebase.png

分支有分叉的場景下:

合并前:

合并前.png

分別執(zhí)行merge/rebase后的情況對比:

  • 應(yīng)用git merge --ff
merge-ff.png
  • 應(yīng)用git merge --no-ff
merge-no-ff.png
  • 應(yīng)用git rebase
rebase.png

實驗結(jié)論

通過結(jié)果圖的對比,可以得到以下結(jié)論:

git merge --ff git merge --no-ff git rebase
分支無分叉 把develop上新的commit嫁接到master的最后commit上,效果等同于rebase,讓master的commit-tree保持線性 生成一個新的commit用于記錄這個合并操作 把develop上新的commit嫁接到master的最后一個commit上,讓master的commit-tree保持線性
分支有分叉 合并時,由于存在沖突,生成一個新的commit用于記錄此沖突,效果等同于 merge --no-ff 生成一個新的commit用于記錄這個合并操作 通過rebase,把develop上新的commit嫁接到master的最后一個commit上,讓master的commit-tree保持線性

怎么選擇

通過合并結(jié)果對比可以知道,在合并時,我們就只需要『merge --no-ff 』和 『rebase』之間做選擇即可。那么在日常開發(fā)中怎么選擇呢?根據(jù)你的合并目的來:

合并目的 需要記錄此次合并,如合并release分支 希望commit-tree整潔和成線性,如合并feature分支 對commit-tree無要求,適合初學(xué)者
合并命令 git merge --no-ff git rebase git merge

參考資料:
https://www.idaima.com/article/6773
http://www.itdecent.cn/p/73ea5aca8bf3
http://www.itdecent.cn/p/0613d8249863

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Git分支管理 master:主分支,當(dāng)前分支上的代碼隨時可以直接發(fā)布,并且只能通過Pull Request從其他...
    UEUEO閱讀 9,950評論 5 33
  • 1. GIT命令 git init在本地新建一個repo,進入一個項目目錄,執(zhí)行g(shù)it init,會初始化一個re...
    江邊一蓑煙閱讀 888評論 0 0
  • 多種多樣的工作流使得在項目中實施Git時變得難以選擇。這份教程提供了一個出發(fā)點,調(diào)查企業(yè)團隊最常見的Git工作流。...
    JSErik閱讀 4,598評論 2 8
  • 最近我的業(yè)績似乎有了很大的提高,這也讓我更加的努力,因為我想知道我到底能夠達成多高的目標(biāo)??稍谶@路上我錯過...
    Time的記憶閱讀 615評論 0 0
  • 曾幾何時 我們都說,要活成自己喜歡的樣子 走著走著 卻發(fā)現(xiàn),慢慢地開始有點討厭自己 每一個年齡段 每一次人生的選擇...
    電影夫人閱讀 753評論 18 29

友情鏈接更多精彩內(nèi)容