前言
上一篇git的文章聊到了git版本管理的commit和分支相關(guān)的內(nèi)容,通過查看./git文件內(nèi)的文本內(nèi)容,可以有個更清晰的認(rèn)識
git版本管理的主要內(nèi)容就是一次次的commit提交
分支的本質(zhì)就是記錄了當(dāng)前指向的commit的哈希值
會有一個HEAD指針去指向當(dāng)前工作的位置,HEAD指針可以掛載在分支,也可以脫離分支直接指向一個commit提交
查看log可以看到commit如果有被引用關(guān)系,后面會有()去顯示相關(guān)的引用關(guān)系
commit原則上是一次次向后推進(jìn)的,通過移動HEAD指針可以從任意的commit去延伸提交記錄鏈,分支僅僅只是一個指針,有了這樣的認(rèn)知,管理分支其實(shí)就是為了讓commit提交記錄更加的好看,可以通過查看歷史快速的了解到具體的改動內(nèi)容
問題
為了commit記錄的整潔,那么如果當(dāng)一次commit已經(jīng)提交,發(fā)現(xiàn)內(nèi)容有錯誤或者想要修改commit的內(nèi)容介紹又該怎么操作?
commit提交有錯誤,可以修改對應(yīng)的錯誤后,再產(chǎn)生一次新的commit去覆蓋,這樣不會影響整個分支的正確性,只是查看歷史的時候會有兩個commit記錄是做了同一功能,這樣會產(chǎn)生多余的提交記錄,不夠整潔
這個時候commit --amend參數(shù)就可以派上用途了
--amend
在使用commit提交的時候,如果加上--amend參數(shù)就可以對最近的一次commit進(jìn)行修改,可以修改commit提交的內(nèi)容簡介,也可以在當(dāng)前commit的提交的基礎(chǔ)上繼續(xù)修改后提交,這樣就會讓提交記錄上不會產(chǎn)生多余的一次提交
直接看例子,以一個單文件的修改進(jìn)行舉例
//在master分支上進(jìn)行了3次提交
commit 746cad0229904535b3c1213235f4a75a1d7ef0fa (HEAD -> master)
Date: Fri Sep 23 09:33:52 2022 +0800
add 2
commit ef8abe2301688429c4facf978df245a90aa20a01
Date: Fri Sep 23 09:33:13 2022 +0800
add 1
commit b1a51914f09bb7f0e5bb4e1b5b32d2d657939936
Date: Fri Sep 23 09:32:31 2022 +0800
first commit
//這個時候想要修改最近的一次提交內(nèi)容,將add 2改為 add 2 amend,可以直接使用
>>> git commit --amend
//接著在vi操作里面將內(nèi)容改為 add 2 amend,
>>> git log
commit 7539bae343faade6b4d3275abc35d13315382e28 (HEAD -> master)
Date: Fri Sep 23 09:33:52 2022 +0800
add 2 amend
commit ef8abe2301688429c4facf978df245a90aa20a01
Date: Fri Sep 23 09:33:13 2022 +0800
add 1
commit b1a51914f09bb7f0e5bb4e1b5b32d2d657939936
Date: Fri Sep 23 09:32:31 2022 +0800
first commit
可以看到通過commit --amend可以直接修改提交的內(nèi)容介紹,查看log日志可以看出,前兩次的提交commit對應(yīng)的哈希值是沒變的,但是新產(chǎn)生的提交記錄的哈希值被改變了

除了修改提交的文本介紹,還可以直接對commit提交后的內(nèi)容再修改提交
//在當(dāng)前的基礎(chǔ)上,再新增一次提交,增加內(nèi)容 add content 3
commit 8a17126665a728a5bfe98d24b3eb29c082f5e4a1 (HEAD -> master)
Date: Fri Sep 23 09:35:00 2022 +0800
add 3
commit 7539bae343faade6b4d3275abc35d13315382e28
Date: Fri Sep 23 09:33:52 2022 +0800
add 2 amend
commit ef8abe2301688429c4facf978df245a90aa20a01
Date: Fri Sep 23 09:33:13 2022 +0800
add 1
>>> git show
//可以發(fā)現(xiàn)最近的一次8a1712提交是在文本的底部新增了add content 3文本
commit 8a17126665a728a5bfe98d24b3eb29c082f5e4a1 (HEAD -> master)
Date: Fri Sep 23 09:35:00 2022 +0800
add 3
//...
-add content 2
\ No newline at end of file
+add content 2
+
+
+
+add content 3
\ No newline at end of file
//雖然是新增了一行文本,git的記錄內(nèi)容將整個文本分塊,記錄的具體內(nèi)容是刪除了老的文本,新增了新的一塊文本
//接下來對這個文件進(jìn)行再一次的修改 在后面加上一個 “edit”
//如果不通過--amend進(jìn)行commit,會在add 3提交的基礎(chǔ)上增加一個新的提交
>>> git commit --amend
commit 54a84c8f51ff2b407e9fb19436fd75584b6170c4 (HEAD -> master)
Date: Fri Sep 23 09:35:00 2022 +0800
add 3 edit
commit 7539bae343faade6b4d3275abc35d13315382e28
Date: Fri Sep 23 09:33:52 2022 +0800
add 2 amend
commit ef8abe2301688429c4facf978df245a90aa20a01
Date: Fri Sep 23 09:33:13 2022 +0800
add 1
//可以看到add 2 amend之后只有一個提交
>>> git show
commit 54a84c8f51ff2b407e9fb19436fd75584b6170c4 (HEAD -> master)
Date: Fri Sep 23 09:35:00 2022 +0800
add 3 edit
//...
-add content 2
\ No newline at end of file
+add content 2
+
+
+
+add content 3 edit
\ No newline at end of file
//可以看出,最近的一次提交,在保留了上一次add content 3文本的基礎(chǔ)上,把我新增的內(nèi)容eidt也記錄進(jìn)去了,并且在add 2 amend的基礎(chǔ)上就一次提交
通過這樣就可以在commit已經(jīng)生效的情況下,對內(nèi)容繼續(xù)修改,修改后通過--amend參數(shù)提交,就會以最新的內(nèi)容(包含最近一次commit的內(nèi)容)去跟上一次commit對比記錄修改內(nèi)容,并產(chǎn)生一次新的提交

小結(jié)
需要明確的是,一旦commit提交產(chǎn)生了歷史記錄,歷史是不可以被修改的,通過--amend這樣的參數(shù)修改最近一次提交記錄也只是一種理解上的修改,其實(shí)是產(chǎn)生了一次新的提交記錄,將當(dāng)前分支和HEAD的引用指向的新的提交記錄,并且新的提交記錄包含了我們所要修改的記錄
通過之前的commit的哈希值,可以直接checkout切換過去,從而驗(yàn)證一下歷史的存在
--amend僅僅對最近的一次commit可以修改,畢竟--amend后沒有更多的參數(shù),使用的局限性還是有的,如果要對不是最近的一次commit進(jìn)行修改,可以使用rebase -i,后面的文章里面會繼續(xù)記錄