Git: 比較 Merge Squash 與 Rebase Squash
29 May 2018比較 Merge Squash 與 Rebase Squash。
會寫這篇文章的原因是…第一次聽到「你合併的時候要 Squash 呀」,當下以為是要用 Rebase Squash,結果提交記錄整個被合併了(哭哭),一查才知道是 Merge Squash,既可保留開發分支的提交記錄,又可在合併回主線時維持主線的清爽乾淨,不然每次合併完看到一堆東西,哪有人受得了 XD
Merge Squash
用於合併不同分支時,希望在合併後只有一個提交記錄。
$ git merge —-squash <branch_name>
範例
開發新功能的時候,往往會另開一個分支來實作,開發完後再合併回主線。這裡假設另開一個分支「test」,開發完成後合併回主線 master。
來看 Sourcetree 的線圖,在分支 test 上,新增兩個修改並提交。
接著,合併至 master 上。
$ git checkout master
$ git merge —-squash test
Updating 72f26fe..9fcf870
Fast-forward
Squash commit -- not updating HEAD
hello_world.html | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
指向 master 最新進度的指標並沒有更新,而是產生變更,因此要先將變更提交並推至遠端。
這樣在 test 分支上依舊保持原本的提交記錄,要看詳細的過程就到這個分支來看;而合併到 master 就只剩下一個合併記錄了(1d3bad0),很清爽!
Rebase Squash
合併本地端所在分支的提交紀錄,用於整理自己的開發歷程。
$ git rebase -i <shl-1>
範例
使用 git log —-oneline
看到有三個提交記錄如下
00e9a2e 第三個提交記錄
5b49ba4 第二個提交記錄
fa773f7 第一個提交記錄
...
希望只看到一個合併紀錄,於是打指令 git rebase -i fa773f7
進入互動模式來標記提交記錄。注意,這裡的提交記錄順序是舊到新,與上面不同。
p fa773f7 第一個提交記錄
s 5b49ba4 第二個提交記錄
s 00e9a2e 第三個提交記錄
p 表示 pick,s 表示 squash,後面兩個標記 s 的會被合併至第一個標示為 p 的提交記錄上。接著,修改第一個提交記錄為「合併三個提交記錄」,它會成為最新/代表的提交記錄,git log —-oneline
看結果如下。
0fa8ed5 合併三個提交記錄
...