先簡(jiǎn)單說(shuō)一下,在提交到遠(yuǎn)程庫(kù)之前我們使用git reset 命令完全可以滿足我們 撤銷操作的需求,如果操作已經(jīng)提交到遠(yuǎn)程庫(kù),那只好使用 git revert 來(lái)提交一個(gè)新的撤銷操作 撤銷 需要撤銷的那次commit。
本地創(chuàng)建一個(gè)文件夾,隨意放哪里,終端進(jìn)入該文件夾,執(zhí)行 git init 建立本地git倉(cāng)庫(kù)。
現(xiàn)在我們可以在該文件夾里添加一個(gè).txt文件,然后.txt文件內(nèi)隨意寫上幾句話。執(zhí)行g(shù)it status 查看狀態(tài)
我們是為了測(cè)試 git reset 和git revert,為了方便測(cè)試,使用git add和git commit給此次修改提交 ,到版本庫(kù)。
然后在給.txt 添加一行新文字 ,執(zhí)行g(shù)it status 顯示如下
現(xiàn)在執(zhí)行g(shù)it reset HEAD,再執(zhí)行g(shù)it status如下:
可以看到?jīng)]有起到任何作用,況且命令行也提示我們了,要么使用git add <file> 添加修改到暫存區(qū),要么使用 git checkout --<file> 放棄修改文件。所以我們使用 git reset HEAD 不起作用,如果我們先 add 再 reset 如下:
又回到了我們執(zhí)行add命令之前的狀態(tài),等于撤銷了add 這個(gè)操作,我們 add ,commit再執(zhí)行reset命令呢?
可以看到,我們 使用 git reset HEAD并不起作用,而是用 git reset HEAD^才起作用,這是因?yàn)樵贕it中,HEAD表示當(dāng)前版本,上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過(guò)來(lái),可以寫成HEAD~100。
可以看到執(zhí)行完git reset HEAD^之后,我們最新一次commit就被撤銷了。注意這里我們使用的是 git reset HEAD^ ,也就是默認(rèn)的git reset --mixed HEAD^,此時(shí)我們執(zhí)行g(shù)it status看到:我們的修改又回到了工作區(qū)。
那么 git reset --hard HEAD^ 和 git reset --soft HEAD^ 呢,
可以看到,我們重新修改commit 之后 如果執(zhí)行的是 --soft的話,那么修改就會(huì)被放回暫存區(qū),執(zhí)行g(shù)it log 的話,最新的一次提交同樣不見(jiàn)了,同理,如果使用 --hard 的話 ,如下:
可以看到什么都沒(méi)有了,修改直接被丟棄了,工作區(qū)和暫存區(qū)都沒(méi)有了。
到這里,我們都沒(méi)有提交到遠(yuǎn)程庫(kù),也就是沒(méi)有執(zhí)行g(shù)it push命令,我們所有的操作都可以通過(guò) git checkout --<file> 或者 git reset HEAD命令來(lái)撤銷掉。
為了便于測(cè)試 git revert,我先 commit了幾次,
可以看到commit 了三次,現(xiàn)在我們想回滾最新的一次commit,使用reset 的話就不說(shuō)了,使用 revert 呢?
找到我們想要revert的commit id 執(zhí)行 git revert <commitid> 然后命令行會(huì)讓你輸入本次 操作的信息,自動(dòng)生成的是?
Revert "***"
This reverts commit ***.
退出編輯模式,然后 執(zhí)行 git log,我們發(fā)現(xiàn)多了一次commit,該次commit信息就是上面的。我們最新一次的修改,在我們?cè)次募褪俏谋疚臋n中沒(méi)有了,(有時(shí)候需要重新打開(kāi)一次文件才能看到效果)。
總結(jié)來(lái)說(shuō):
git checkout --<file> 可以撤銷工作區(qū)的修改
git reset HEAD 可以撤銷 git add 操作
git reset HEAD^ 可以撤銷 git commit 操作(默認(rèn)為 git reset --mixed HEAD^:修改會(huì)被放回工作區(qū),--soft 修改會(huì)放到暫存區(qū) ,--hard 修改會(huì)直接被丟棄)
到這里,基本理清了這二者的區(qū)別了。如果有理解錯(cuò)誤的地方,歡迎指正。謝謝。