Git: 比較 Merge Squash 與 Rebase Squash

Git: 比較 Merge Squash 與 Rebase Squas

比較 Merge Squash 與 Rebase Squash。

會寫這篇文章的原因是…第一次聽到「你合併的時候要 Squash 呀」,當下以為是要用 Rebase Squash,結果提交記錄整個被合併了(哭哭),一查才知道是 Merge Squash,既可保留開發分支的提交記錄,又可在合併回主線時維持主線的清爽乾淨,不然每次合併完看到一堆東西,哪有人受得了 XD

Merge Squash

用於合併不同分支時,希望在合併後只有一個提交記錄。

$ git merge —-squash <branch_name>

範例

開發新功能的時候,往往會另開一個分支來實作,開發完後再合併回主線。這裡假設另開一個分支「test」,開發完成後合併回主線 master。

來看 Sourcetree 的線圖,在分支 test 上,新增兩個修改並提交。

Merge Squash

接著,合併至 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 最新進度的指標並沒有更新,而是產生變更,因此要先將變更提交並推至遠端。

Merge Squash

這樣在 test 分支上依舊保持原本的提交記錄,要看詳細的過程就到這個分支來看;而合併到 master 就只剩下一個合併記錄了(1d3bad0),很清爽!

Merge Squash

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 合併三個提交記錄
...

git rebase git Sourcetree