是否曾經在開發階段時,會有一些不必要的(令人慚愧的) commit name 如: WIP、update1、update2、勿動 … 之類,這類只有自己懂的 commit name,我想肯定不會想送出 PR(MR) 被同事鞭吧 (?

而在 Git 裡,提供了 rebase -i 互動模式(interactive),以下介紹自己常使用的 squash 指令。

squash 有 把…壓扁、擠扁、粉碎等意思,而在 Git 情境裡,則是將不滿意的 commit name 做擠壓而成一個新的 commit name。

首先,先看一下目前本地端 Git 的 commit 情況。

$ git log。

在上面可以看到我目前有四個 commit ,但其中從 HEAD (包括HEAD本身)以下的這三個 commit 我想整理它們。

$ git rebase -i 457c213

上面指令的意思為: 從目前的 commit(也就是HEAD所在處),到我想要 rebase 的 commit ,在這裡就是 457c213,而上面的指令原本寫法為:

$ git rebase -i ㅤ 457c213 ㅤ ㅤ  ㅤ     02f7caa

ㅤ  ㅤ  ㅤ  (rebase 的節點)ㅤ  (目前 HEAD 的節點)

輸入指令後,會進入到 Vim 編輯器下,在裡面有提供許多好用的指令,這邊會使用 pick 與 squash,其中 pick 則是保持該 commit 目前的狀態,而在欲 squash 的 commit 前改為 squash (或簡寫s)。

補充 : 在 git rebase -i 模式下, commit 的排序方式會與 git log 反方向。

將要被修改的 commit name 更改為 s。

退出並儲存修改, ^x,Y,enter。

接著會來到另外一個頁面。

squash commit and rename it

退出並儲存修改, ^x,Y,enter。

再次查看目前的 log。

$ git log

剛剛的三個 commit name 已被合成為一個新的 commit name。