將多個 Commit 合併成一個 (Squash Commits)
最近在工作上遇到需要 Squash Commits 的情況,完全不懂「Squash Commits」是什麼的我,瘋狂查了一堆文章。雖然這些文章已經寫得很簡單易懂,也都有搭配圖片說明,但卻總是缺了一點小細節,讓我在操作時仍舊遇到困難。因此,我打算簡單整理一篇文章,記錄自己的操作步驟,也幫助其他人快速合併多個 Commit。
以下操作步驟是在 VS Code Terminal 中進行:
1. 查看提交歷史
$ git log --oneline9d13562 (HEAD -> test, origin/test) feat: add cat 3c2336f7 feat: add cat 2e15527e feat: add cat 1263e56c Remove unused HTML comments假設我們需要將 feat: add cat 2 (c2336f7) 跟 feat: add cat 3 (9d13562)合併進 feat: add cat 1 (e15527e)。
📌 要離開 log 只要按一下鍵盤上的 q 即可
2. 開始合併
$ git rebase -i HEAD~3# 或是$ git rebase -i e15527e^這裡的 HEAD~3 代表要合併從最近的 Commit (HEAD) 開始算起的前三個 Commits,也可以使用 Commit ID 直接指定要合併進的 Commit。
送出後就會進入編輯模式,內容如下:
pick e15527e feat: add cat 1pick c2336f7 feat: add cat 2pick 9d13562 feat: add cat 3
# 重定基底 263e56c..9d13562 到 263e56c(3 個提交)## 命令:# 以下略過📌 如果進到編輯模式後發現 rebase 錯了,可以按下 ESC 鍵,再輸入 :qa! 送出,離開並取消本次 rebase。
由於我們是要把 feat: add cat 2 跟 feat: add cat 3 合併進 feat: add cat 1,所以把需要合併的 Commits 前面的 pick 改成 squash 或 s。
pick e15527e feat: add cat 1s c2336f7 feat: add cat 2s 9d13562 feat: add cat 3📌 按一下鍵盤上的 a 可以進入編輯模式 (會看到出現 — INSERT —)
編輯完後,按下 ESC 鍵,再輸入 :wq 送出。
3. 編輯 Commit 訊息
接著會再進入編輯模式,內容如下:
# 這是整合 3 個提交的集合提交。# 這是第一個提交說明:
feat: add cat 1
# 這是提交說明 #2:
feat: add cat 2
# 這是提交說明 #3:
feat: add cat 3
# 以下略過這是合併後的 Commit 訊息,可以將這三個 Commits 的訊息整合成一個,但個人覺得在這裡編輯 Commit 訊息很常失敗,所以我確認要合併的提交沒問題後,就會按下 ESC 鍵,輸入 :wq 送出。
4. 修改 Commit 訊息
$ git log --oneline18aa49b (HEAD) feat: add cat 1263e56c Remove unused HTML comments再次查看提交歷史,可以看到 feat: add cat 2 跟 feat: add cat 3 已經被合併進 feat: add cat 1 (18aa49b),多餘的 Commits 也已經被移除。
這是我們修改一下訊息,使其更加完整:
$ git commit --amend -m "feat: add all cats"5. 強制推送
$ git push --force origin <分支名稱>如果你要推送的分支爲 protected 則無法強制推送 (也不建議)
其實我還不知道為什麼不能一般推送,它會需要 merge 我覺得很醜,所以我目前是強制推送。 如果有人知道更好的方式,請告訴我 ( ´•̥ω•̥` )
