這是我們Git中的第三種後悔藥。
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]>'
場景描述:
開發程式碼已提交到本地版本庫中,提交後發現這次提交的程式碼有問題,或者漏提交了一些檔案,此時希望達到以下目的:
git add
)即:有時你提交過程式碼之後,發現一個地方改錯了,你下次提交時不想保留上一次的記錄,或者你上一次的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
文章。
場景描述:
假設新接到需求,需要基於master
分支拉取一個feature
分支,且這個feature
分支只有你自己使用(這一點極其重要),由於開發週期較長,你不想每一次提交都產生一個新的commit
,而是想每一次commit
都修改前一次提交(一直追加提交)。
這樣做的好處是,等到你的feature
分支提測時,就只有一個乾淨的commit
,沒有亂七八糟的提交歷史,你只要把這一個commit
合併到master
裡就好了 。
操作步驟:
在feature
分支上:
git commit -a -m "第1次提交的註釋"
進行提交。git commit --amend -m "這裡填寫提交的註釋"
進行提交。commit
。範例:
不推薦這樣操作,多次提交可以使你選擇復原的餘地比較多,簡化提交次數是比較好的想法,但更推薦使用git rebase
命令進行操作。
這裡就不演示了。
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
命令,過程如下:
參考: