這是我們Git中的第三種後悔藥。
1、git commit --amend
命令說明
git commit --amend
命令:也叫追加提交,它可以在不增加一個新的commit的情況下,將新修改的代碼追加到前一次的commit中。
使用該命令的好處,是避免許多無用的提交。
說明:
- 如果自上次提交以來,你還未做任何修改(例如,在上次提交後馬上執行了此命令),那麼快照會保持不變(不產生新的commit),而修改的只是提交信息。
- 或者你提交後發現忘記了暫存某些需要的修改,可以將該文件添加到暫存區,然後在使用
git commit --amend
命令進行追加提交。
常用參數:
--no-edit
:使用選定的提交消息而無需啓動編輯器。(追加提交,且不修改message信息。)-
--reset-author
:加載提交用戶的信息。比如你從新配置本地用戶的信息,然後使用該參數可以重新加載新用戶的信息,並且更新在追加提交中。
-
--author=
:可修改Git 的author
和email
信息。示例:
git commit --amend --author='xxx <[email protected]>'
2、使用場景
(1)場景一
場景描述:
開發代碼已提交到本地版本庫中,提交後發現這次提交的代碼有問題,或者漏提交了一些文件,此時希望達到以下目的:
- 修改有問題的代碼。
- 補足漏提交的文件。(一般是新增的文件沒有git add )
- 把以上2點相關的代碼,和前一次提交的代碼合併成一個提交。
- 給合併後的提交添加新的註釋。
即:有時你提交過代碼之後,發現一個地方改錯了,你下次提交時不想保留上一次的記錄,或者你上一次的commit message的描述有誤,這時候你可以使用 git commit --amend
命令來解決。
解決步驟:
- 修改問題代碼。
- 執行
git add .
命令,把漏提交的文件加入暫存區。 - 執行
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文件
我們可以看到:
- 第三次提交的massage改變了。
- 看到第三次提交的commit-id由
bd4fd48
變成了69a9841
- 我們可以看到使用
git commit --amend
命令,表面上沒有生成新的提交,只是進行了內容的追加。但實際上通過git reflog
命令查看歷史提交記錄,我們還是看到了,其實是新生成了一個commit。
說明:
- 關於
git commit --amend
命令原理,往下看。- 關於如何修改更早提價的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
命令底層原理如下:
前提:你把遺漏提交的文件,或者修改的文件先提交到暫存區。
git reset --soft HEAD^
:回退一個版本,且工作區和暫存區中的內容不會退。-
git commit -c ORIG_HEAD
:提交操作。在根據此時的暫存區生成一個新的提交對象,代替原來提交的位置。說明:
-C <commit>
,全稱--reuse-message=<commit>
:獲取現有的提交對象,並在創建提交時重用現有提交對象的日誌消息和作者信息(包括時間戳)。-c <commit>
,全稱--reedit-message=<commit>
:與-C
類似,但是-c
會調用編輯器,以便用戶可以進一步編輯提交消息。
看如下圖示:
假設master分支上的提交歷史如下圖:
運行git commit --amend
命令,過程如下:
就相當於新建一個分支,把commit-3
提交隱藏在歷史提交記錄的長河裏。但使用reflog
命令還是可以查看到的。
參考: