概念
Rebase 和 merge 都被設計用來將變更從一個分支整合到另一個分支,但是它們的實現方式卻不同。
下面假如我們有如下提交,merge 會將兩個分支的代碼合併,而 rebase 會將 feature 分支上所有的變更在 master 分支上重新應用一遍:
- 當你將 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 來合併功能分支,同一個衝突可能需要合併多次。
總結
- 如果有幾個開發者同時在 feature 分支上開發,就不推薦使用 rebase,因爲 rebase 會掩蓋真實的提交場景。相對而言,個人開發更適合使用 rebase。
- 如果你想保留完整的歷史記錄,就應該使用 merge。記住,Merge 保留歷史記錄,而 Rebase 改寫歷史記錄
Rebase 可以用來精簡一個複雜的歷史記錄,通過交互式 rebase,你可以去掉不想要的 commit,合併多個 commit 甚至修改 commit 信息。
需要注意的是,由於 rebase 是將 commit 一個一個應用到目標分支,所以在產生衝突時,需要針對 commit 一個一個去解決,而 merge 是將 commit 的最終結果合併到目標分支,所以衝突只需要解決一次即可。而如果有很多衝突的話,撤銷一個 rebase 也將會非常困難。