將多個 Commits 合併成一個 (Squash Commits)

使用 git rebase -i 將多個 Commits 合併成一個,讓專案具有整潔的提交歷史記錄。

最近在工作上遇到需要 Squash Commits 的情況,完全不懂「Squash Commits」是什麼的我,瘋狂查了一堆文章。雖然這些文章已經寫得很簡單易懂,也都有搭配圖片說明,但卻總是缺了一點小細節,讓我在操作時仍舊遇到困難。因此,我打算簡單整理一篇文章,記錄自己的操作步驟,也幫助其他人快速合併多個 Commits。

以下操作步驟是在 VS Code Terminal 中進行:

1. 查看提交歷史

1
2
3
4
5
$ git log --oneline
9d13562 (HEAD -> test, origin/test) feat: add cat 3
c2336f7 feat: add cat 2
e15527e feat: add cat 1
263e56c Remove unused HTML comments

假設我們需要將 feat: add cat 2 (c2336f7)feat: add cat 3 (9d13562)合併進 feat: add cat 1 (e15527e)

📌 要離開 log 只要按一下鍵盤上的 q 即可

2. 開始合併

1
2
3
$ git rebase -i HEAD~3
# 或是
$ git rebase -i e15527e^

這裡的 HEAD~3 代表要合併從最近的 Commit (HEAD) 開始算起的前三個 Commits,也可以使用 Commit ID 直接指定要合併進的 Commit。

送出後就會進入編輯模式,內容如下:

1
2
3
4
5
6
7
8
pick e15527e feat: add cat 1
pick c2336f7 feat: add cat 2
pick 9d13562 feat: add cat 3

# 重定基底 263e56c..9d13562 到 263e56c(3 個提交)
#
# 命令:
# 以下略過

📌 如果進到編輯模式後發現 rebase 錯了,可以按下 ESC 鍵,再輸入 :qa! 送出,離開並取消本次 rebase。

由於我們是要把 feat: add cat 2feat: add cat 3 合併進 feat: add cat 1,所以把需要合併的 Commits 前面的 pick 改成 squashs

1
2
3
pick e15527e feat: add cat 1
s c2336f7 feat: add cat 2
s 9d13562 feat: add cat 3

📌 按一下鍵盤上的 a 可以進入編輯模式 (會看到出現 -- INSERT --)

編輯完後,按下 ESC 鍵,再輸入 :wq 送出。

3. 編輯 Commit 訊息

接著會再進入編輯模式,內容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 這是整合 3 個提交的集合提交。
# 這是第一個提交說明:

feat: add cat 1

# 這是提交說明 #2:

feat: add cat 2

# 這是提交說明 #3:

feat: add cat 3

# 以下略過

這是合併後的 Commit 訊息,可以將這三個 Commits 的訊息整合成一個,但個人覺得在這裡編輯 Commit 訊息很常失敗,所以我確認要合併的提交沒問題後,就會按下 ESC 鍵,輸入 :wq 送出。

4. 修改 Commit 訊息

1
2
3
$ git log --oneline
18aa49b (HEAD) feat: add cat 1
263e56c Remove unused HTML comments

再次查看提交歷史,可以看到 feat: add cat 2feat: add cat 3 已經被合併進 feat: add cat 1 (18aa49b),多餘的 Commits 也已經被移除。

這是我們修改一下訊息,使其更加完整:

1
$ git commit --amend -m "feat: add all cats"

5. 強制推送

1
$ git push --force origin <分支名稱>

如果你要推送的分支爲 protected 則無法強制推送 (也不建議)

其實我還不知道為什麼不能一般推送,它會需要 merge 我覺得很醜,所以我目前是強制推送。 如果有人知道更好的方式,請告訴我 ( ´•̥ω•̥` )


如果你覺得這篇文章對你有幫助,可以考慮請我喝杯奶茶 ❤️

Buy me a MilkTea
Licensed under CC BY-NC-SA 4.0