帶你理解 Git 中的 Merge 和 Rebase

概念

Rebase 和 merge 都被設計用來將變更從一個分支整合到另一個分支,但是它們的實現方式卻不同。

下面假如我們有如下提交,merge 會將兩個分支的代碼合併,而 rebase 會將 feature 分支上所有的變更在 master 分支上重新應用一遍:

1-three.png

  • 當你將 feature 分支 rebase 到 master 時,實際上是將 feature 的 base 移動到了 master 分支的終點,所以 rebase 中文叫變基。(想象上圖平移了兩條線段)
  • merge 則是拿 feature 分支中的結果,合併到 master 分支,這個過程中只有 master 分支改變了,feature 分支保持不變
  • merge 的時候會產生一個新的 commit

Merge 的優與劣

優點

  • 簡單易用,易於理解
  • 保留原始提交記錄和源分支
  • 源分支上的提交與其他分支分離,這會方便你瀏覽並且合併到其他分支
  • 保留你的提交歷史,保證提交歷史在語義上的準確性

缺點

  • 提交歷史 可能會變得很亂,尤其是很多人同時開發與合併分支時
  • 使用 git bisect 調試將變得困難

Rebase 的優與劣

優點

  • 代碼歷史簡潔,線性,可讀性強
  • 相比衆多功能分支來說,只有一個分支,管理起來更加方便
  • 簡潔的 提交記錄 讓調試和排查更容易

缺點

  • feature 分支變成了一些 commit,不利於體現開發時的場景
  • Rebase 不適合與 pull requests 同時工作,因爲你看不出來哪裏是別人做的變更。重寫了歷史記錄也不利於團隊協作

    你在使用 rebase 時也應該更加小心
  • 在處理 衝突 時需要花費更多的精力,使用 rebase 來合併功能分支,同一個衝突可能需要合併多次。

總結

  1. 如果有幾個開發者同時在 feature 分支上開發,就不推薦使用 rebase,因爲 rebase 會掩蓋真實的提交場景。相對而言,個人開發更適合使用 rebase。
  2. 如果你想保留完整的歷史記錄,就應該使用 merge。記住,Merge 保留歷史記錄,而 Rebase 改寫歷史記錄

Rebase 可以用來精簡一個複雜的歷史記錄,通過交互式 rebase,你可以去掉不想要的 commit,合併多個 commit 甚至修改 commit 信息。

需要注意的是,由於 rebase 是將 commit 一個一個應用到目標分支,所以在產生衝突時,需要針對 commit 一個一個去解決,而 merge 是將 commit 的最終結果合併到目標分支,所以衝突只需要解決一次即可。而如果有很多衝突的話,撤銷一個 rebase 也將會非常困難。

參考文章

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章