← 上一章:【狀況題】如何在 Git 裡刪除檔案或變更檔名? 下一章:【狀況題】追加檔案到最近一次的提交錄 →


【狀況題】修改 Commit 紀錄

遇到澳州來的客人,做得很不爽,因為心情不好,不小心在 Commit 訊息罵了客戶了,要怎麼消掉?

身為工程師,偶爾總是會遇上不太順心的客人或專案,心情不好的時候,在程式碼或 Commit 訊息裡「抒發」一下情緒也是很常見的,只是這要是讓客人看見了總是不好解釋。

要修改 Commit 紀錄有好幾種方法:

  1. .git 目錄整個刪除(誤)。
  2. 使用 git rebase 來修改歷史。
  3. 先把 Commit 用 git reset 拆掉,整理後再重新 Commit。
  4. 使用 --amend 參數來修改最後一次的 Commit。

這裡我們將使用第 4 種方式來修改最後一次的 Commit 訊息,第 2 跟第 3 種方式會在後面的章節陸續介紹到,至於第 1 種方式等於是砍掉重練,因為那會把該專案所有的 Git 紀錄全部清掉,除非必要,不要輕易使用。

使用 --amend 參數來進行 Commit

例如原來的紀錄是這個樣子:

$ git log --oneline
4879515 WTF
7dbc437 add hello.html
657fce7 add container
abb4f43 update index page
cef6e40 create index page
cc797cd init commit

那個 “WTF” 訊息有點糟糕!要修改最後一次的 Commit 訊息,只要直接在 Commit 指令後面加上 --amend 參數即可:

$ git commit --amend -m "Welcome To Facebook"
[master 614a90c] Welcome To Facebook
Date: Wed Aug 16 05:42:56 2017 +0800
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 config/database.yml

如果沒有加上 -m 參數提供要修改的訊息,就會跳出 Vim 視窗讓你編輯訊息。再回來看紀錄,”WTF” 就被改成 “Welcome To Facebook” 了:

$ git log --oneline
614a90c Welcome To Facebook
7dbc437 add hello.html
657fce7 add container
abb4f43 update index page
cef6e40 create index page
cc797cd init commit

如果是使用 SourceTree,請先點選左上角的 Commit 按鈕進行 Commit 畫面,然後在右上角的「Commit Options」選擇「Amend last commit」:

Amend

在下方的空格填寫好訊息,按下右下的 Commit 按鈕後就可修改。

你注意到了嗎?

雖然只是改紀錄的訊息,其它什麼都沒有改,但對 Git 來說因為「Commit 的內容」改變了,所以 Git 會重新計算並產生一顆新的 Commit 物件,也就是這其實是一次全新的 Commit(只是看起來不像新的)。以上面這個例子為例,修改前的 Commit 物件的 SHA-1 值是 4879515,但改完訊息之後 SHA-1 值變成 614a90c。雖然 Commit 的時間跟檔案的內容看起來並沒有被修改,但它仍是一次全新的 Commit。

那可以修改更早的紀錄嗎?

可以的,只是就得使用 Rebase 指令來處理了,--amend 參數只能處理最後一次而已。Rebase 指令的使用方式請參閱「【狀況題】修改歷史訊息」章節說明。

平行時空

請記得,雖然這只是改訊息,不管如何它就是修改了一次的歷史,所以請儘量不要在已經 Push 出去之後再修改,否則可能會造成其它人的困擾。


← 上一章:【狀況題】如何在 Git 裡刪除檔案或變更檔名? 下一章:【狀況題】追加檔案到最近一次的提交錄 →

Comments