[Git] rebase 合併分支

除了Merge之外的另一種選擇

什麼是rebase?

rebase(衍合)可以把一個分支中的修改整合到另一個分支。例如,當你從master建立了一個develop branch進行開發,然而卻發現master有一個bug必須先行修改才能繼續開發,於是你切回了master,做出修改後送出commit。但此時切回develop後又必須將剛剛master的修改合併進來,此時就可以使用 rebase。

原本的tree:

A--B(master)
\--C--D(develop)

修正bug後,master產生了新的E節點:

A--B--E(master/bug-fix)
\--C--D(develop)

利用 git rebase master使develop移動到E節點上:

A--B--E(master/bug-fix)
\--C--D(develop)

rebase使用的時機?

把在一個分支裡提交的改變移到另一個分支裡重做一遍,或在合併回主枝幹前整理、刪除不必要的commits。

rebase能做的事:

  • 修改commit訊息
  • 編輯commit
  • 拆解commit
  • 合併多個commit
  • 調換順序(危險)- 如果有依賴關係容易造成錯誤。

ihower的示範操作:

可能發生的問題?

一旦branch中的commit發佈到origin之後,就千萬不要對該branch進行rebase操作。

在進行rebase的時候,實際上拋棄了一些現存的提交物件而創造了一些類似但不同的新的提交物件。如果你把原來分支中的提交物件發佈出去,並且其他人更新下載後在其基礎上開展工作,而稍後你又用 git rebase 拋棄這些提交物件,把新的重演後的提交物件發佈出去的話,你的合作者就不得不重新合併他們的工作,這樣當你再次從他們那裡獲取內容時,提交歷史就會變得一團糟。 — Git 分支 — 分支的衍合

參考: Rebase — 合併的另種選擇

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.