【學了就忘】Git後悔藥 — 39.git commit --amend 命令

這是我們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. 把以上2點相關的代碼,和前一次提交的代碼合併成一個提交。
  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-id由bd4fd48變成了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命令,過程如下:

就相當於新建一個分支,把commit-3提交隱藏在歷史提交記錄的長河裏。但使用reflog命令還是可以查看到的。

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章