『現學現忘』Git後悔藥 — 34、git commit --amend 命令

2022-10-17 12:00:17

這是我們Git中的第三種後悔藥。

1、git commit --amend 命令說明

git commit --amend 命令:也叫追加提交,它可以在不增加一個新的commit的情況下,將新修改的程式碼追加到前一次的commit中。

使用該命令的好處,是避免許多無用的提交。

說明:

  • 如果自上次提交以來,你還未做任何修改(例如,在上次提交後馬上執行了此命令),那麼快照會保持不變(不產生新的commit),而修改的只是提交資訊。
  • 或者你提交後發現忘記了暫存某些需要的修改,可以將該檔案新增到暫存區,然後在使用git commit --amend 命令進行追加提交。

常用引數

  • --no-edit:使用選定的提交訊息而無需啟動編輯器。(追加提交,且不修改message資訊。)
  • --reset-author:載入提交使用者的資訊。
    比如你從新設定本地使用者的資訊,然後使用該引數可以重新載入新使用者的資訊,並且更新在追加提交中。
  • --author=:可修改Git 的 authoremail 資訊。
    範例:git commit --amend --author='xxx <[email protected]>'

2、使用場景

(1)場景一

場景描述:

開發程式碼已提交到本地版本庫中,提交後發現這次提交的程式碼有問題,或者漏提交了一些檔案,此時希望達到以下目的:

  1. 修改有問題的程式碼。
  2. 補足漏提交的檔案。(一般是新增的檔案沒有git add
  3. 把以上兩點相關的程式碼,和前一次提交的程式碼合併成一個提交。
  4. 給合併後的提交新增新的註釋。

即:有時你提交過程式碼之後,發現一個地方改錯了,你下次提交時不想保留上一次的記錄,或者你上一次的commit message的描述有誤,這時候你可以使用 git commit --amend 命令來解決。

解決步驟:

  1. 修改問題程式碼。
  2. 執行git add . 命令,把漏提交的檔案加入暫存區。
  3. 執行git commit --amend -m "這裡填寫提交的註釋"命令進行提交。

範例:修改最新一次提交的message

有的時候,我們剛剛進行一次提交,突然發現該提交的描述(message)不是很準確。所以需要對該提交的message進行修改(最近一次的commit)。

1)首先檢視當前分支的歷史提交情況。

# 1.檢視版本庫歷史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git log --oneline
bd4fd48 (HEAD -> master) 第3次提交,新增內容:git commit --amend v3
8b3a071 第2次提交,新增內容:git commit --amend v2
d3e2d8c 第1次提交,新增readme.txt檔案

# 2.檢視可回退歷史提交資訊。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git reflog
bd4fd48 (HEAD -> master) HEAD@{0}: commit: 第3次提交,新增內容:git commit --amend v3
8b3a071 HEAD@{1}: commit: 第2次提交,新增內容:git commit --amend v2
d3e2d8c HEAD@{2}: commit (initial): 第1次提交,新增readme.txt檔案

2)修改最新一次歷史提交記錄。

最新一次歷史提交記錄,也就是第3次提交。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git commit --amend -m "我是第3次提交,重新修改的message"
[master 69a9841] 我是第3次提交,重新修改的message
 Date: Tue Apr 20 17:41:44 2021 +0800
 1 file changed, 1 insertion(+)

提示:如果此時有需要新增或改動的檔案,可以先把檔案新增都暫存區,然後隨著git commit --amend命令,一起追加提交。

3)再次檢視當前分支的歷史提交情況。

# 1.檢視版本庫歷史提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git log --oneline
69a9841 (HEAD -> master) 我是第3次提交,重新修改的message
8b3a071 第2次提交,新增內容:git commit --amend v2
d3e2d8c 第1次提交,新增readme.txt檔案


# 2.檢視可回退歷史提交資訊。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/amend_test (master)
$ git reflog
69a9841 (HEAD -> master) HEAD@{0}: commit (amend): 我是第3次提交,重新修改的message
bd4fd48 HEAD@{1}: commit: 第3次提交,新增內容:git commit --amend v3
8b3a071 HEAD@{2}: commit: 第2次提交,新增內容:git commit --amend v2
d3e2d8c HEAD@{3}: commit (initial): 第1次提交,新增readme.txt檔案

我們可以看到:

  1. 第三次提交的massage改變了。
  2. 看到第三次提交的commit-idbd4fd48變成了69a9841
  3. 我們可以看到使用git commit --amend命令,表面上沒有生成新的提交,只是進行了內容的追加。但實際上通過git reflog命令檢視歷史提交記錄,我們還是看到了,其實是新生成了一個commit

說明:

  1. 關於git commit --amend命令原理,往下看。
  2. 關於如何修改更早提價的message,看後面的git rebase文章。

(2)場景二

場景描述:

假設新接到需求,需要基於master分支拉取一個feature分支,且這個feature分支只有你自己使用(這一點極其重要),由於開發週期較長,你不想每一次提交都產生一個新的commit,而是想每一次commit都修改前一次提交(一直追加提交)。

這樣做的好處是,等到你的feature分支提測時,就只有一個乾淨的commit,沒有亂七八糟的提交歷史,你只要把這一個commit合併到master裡就好了 。

操作步驟:

feature分支上:

  • 第1次提交程式碼時,使用命令git commit -a -m "第1次提交的註釋"進行提交。
  • 第2次以及只後的提交,使用命令git commit --amend -m "這裡填寫提交的註釋"進行提交。
    這樣整個分支可以只有一個commit

範例:

不推薦這樣操作,多次提交可以使你選擇復原的餘地比較多,簡化提交次數是比較好的想法,但更推薦使用git rebase命令進行操作。

這裡就不演示了。

3、git commit --amend 命令原理

git commit --amend這個命令給人的感覺,是用新提交的資料,追加到了前一個commit上。

其實git commit --amend命令底層原理如下:

前提:你把遺漏提交的檔案,或者修改的檔案先提交到暫存區。

  1. git reset --soft HEAD^:回退一個版本,且工作區和暫存區中的內容不會退。
  2. git commit -c ORIG_HEAD:提交操作。在根據此時的暫存區生成一個新的提交物件,代替原來提交的位置。
    說明:
    -C <commit>,全稱--reuse-message=<commit>:獲取現有的提交物件,並在建立提交時重用現有提交物件的紀錄檔訊息和作者資訊(包括時間戳)。
    -c <commit>,全稱--reedit-message=<commit>:與-C類似,但是-c會呼叫編輯器,以便使用者可以進一步編輯提交訊息。

看如下圖示:

假設master分支上的提交歷史如下圖:

執行git commit --amend命令,過程如下:

參考: