一:reset 和 revert的區(qū)別
Reset是回退到某個(gè)指定的節(jié)點(diǎn),往后的一律消失;
Revert是撤回某個(gè)指定的節(jié)點(diǎn),剩下的提交記錄都還在,包括操作的revert節(jié)點(diǎn);
二:談?wù)凴eset 涉及的屬性
舉例:
新建一個(gè)文件,并輸入文字然后提交:
GIT查看提交記錄就會(huì)出現(xiàn)第一次提交:
提交后查看遠(yuǎn)程倉(cāng)庫(kù)目錄及文件內(nèi)容:
[圖片上傳失敗...(image-61bd8f-1641457575108)]
再次修改readme.txt文件,并提交到遠(yuǎn)程倉(cāng)庫(kù)
[圖片上傳失敗...(image-ce7452-1641457575107)]
[圖片上傳失敗...(image-25c576-1641457575107)]
查看遠(yuǎn)程倉(cāng)庫(kù)是否正確提交:
[圖片上傳失敗...(image-fc0b3d-1641457575107)]
[圖片上傳失敗...(image-dd4ac9-1641457575107)]
現(xiàn)在再新增一個(gè)test.html文件,并把他推送到遠(yuǎn)程倉(cāng)庫(kù)
[圖片上傳失敗...(image-f5673a-1641457575106)]
[圖片上傳失敗...(image-e006bf-1641457575106)]
再次查看遠(yuǎn)程倉(cāng)庫(kù)和提交記錄
[圖片上傳失敗...(image-7ab916-1641457575106)]
[圖片上傳失敗...(image-6807f2-1641457575106)]
這時(shí)需要變更:不要test也不要readme上的第二次修改的內(nèi)容,需要版本回退到第一次提交的‘T1’,那用reset操作 → git reset --hard commitId
[圖片上傳失敗...(image-1d6562-1641457575106)]
此時(shí)本地test已刪除,readme也回到了第一次提交的記錄,但是查看遠(yuǎn)程依然是最新的代碼并沒(méi)有回退,那么需要本來(lái)push來(lái)更新。
[圖片上傳失敗...(image-5c31bf-1641457575106)]
[圖片上傳失敗...(image-3f38e0-1641457575106)]
當(dāng)我執(zhí)行g(shù)it push會(huì)失敗,因?yàn)楸镜卮a回到了舊版本,但遠(yuǎn)程倉(cāng)庫(kù)是新版本和本地不一致,所以當(dāng)我用git push時(shí)會(huì)報(bào)錯(cuò),這里我們需要使用強(qiáng)制提交:git push -f
[圖片上傳失敗...(image-e3f84a-1641457575106)]
再看遠(yuǎn)程倉(cāng)庫(kù)已回退
[圖片上傳失敗...(image-e7e651-1641457575106)]
這個(gè)時(shí)候看提交記錄也回到了第一次提交,后面的記錄都沒(méi)了
[圖片上傳失敗...(image-294a32-1641457575106)]
可見(jiàn),reset是徹徹底底的回退,該commit之后的所有修改將完全消失,包括提交記錄。
Reset hard的其他幾種回退方法:
git reset --hard HEAD^
git reset --hard HEAD~2
^的個(gè)數(shù)/~2表示回退的個(gè)版本個(gè)數(shù)
優(yōu)點(diǎn):
<u>徹底回退到指定版本,代碼提交記錄干凈清爽;</u>
<u>提交時(shí)間線也清晰沒(méi)有冗雜;</u>
缺點(diǎn):
記錄徹底清除,無(wú)法再次恢復(fù);
- git reset --soft commitId, 還原到<u>暫存區(qū)</u>
[圖片上傳失敗...(image-1c8975-1641457575105)]
- git reset --mixed commitId, 把文件還原到<u>工作區(qū)</u>
[圖片上傳失敗...(image-6dfee9-1641457575105)]
三:談?wù)凴evert:
revert執(zhí)行后會(huì)產(chǎn)生新的commit記錄,是通過(guò)一次新的commit來(lái)恢復(fù)到之前舊的commit,但revert會(huì)保留恢復(fù)的該次提交后面的其它提交內(nèi)容,假如后面的提交與要恢復(fù)的提交更改了同一地方,此時(shí)用revert就會(huì)產(chǎn)生沖突!
我們把上面的三次提交再操作一次;
[圖片上傳失敗...(image-c62a58-1641457575105)]
[圖片上傳失敗...(image-21d1da-1641457575105)]
[圖片上傳失敗...(image-dd070c-1641457575105)]
此時(shí)我們用reset的思路來(lái)回退到第一次提交,命令行 → Git revert commitId
[圖片上傳失敗...(image-f0e78b-1641457575105)]
如上所示<u>沖突</u>了,當(dāng)前內(nèi)容是第2次提交,而我們要恢復(fù)的內(nèi)容是read 1
如果對(duì)revert命令沒(méi)有深入了解的話,就可能會(huì)產(chǎn)生疑惑,為什么會(huì)沖突?而且我實(shí)際上是想像reset一樣恢復(fù)或者說(shuō)是回退到T1(這里要再次說(shuō)明一下第一次提交的狀態(tài):只有一個(gè)readme文件,且內(nèi)容是第一次提交),但為什么沖突提示要恢復(fù)到read 1.???這是初始第一次寫(xiě)的。
其實(shí),準(zhǔn)確來(lái)說(shuō),revert是撤銷(xiāo)/撤回/反提交的意思,我們不能按reset的思路理解,我們執(zhí)行g(shù)it revert T1,這么做其實(shí)結(jié)果是要撤銷(xiāo)第一次的提交,注意,僅僅是撤銷(xiāo)T1的提交,把T1的修改恢復(fù)到T1之前也就是初始的狀態(tài),而不會(huì)影響T2,T3的提交。但如果T2,T3中修改了T1修改的同一地方,那么就會(huì)產(chǎn)生沖突,因?yàn)閞evert意圖撤銷(xiāo)T1的修改,但發(fā)現(xiàn)T2和T3把T1的修改再次修改了,此時(shí),revert意圖變得不清晰,因?yàn)樗鼰o(wú)法確定到底是應(yīng)用你最新的修改,還是恢復(fù)到初始狀態(tài),這將由你來(lái)決定!
那如果我們要恢復(fù)T1的狀態(tài),那需要撤銷(xiāo)T2來(lái)對(duì)T1進(jìn)行修改 git revert T2:
[圖片上傳失敗...(image-1eab7-1641457575104)]
這里需要我們修改或輸入提交日志,按 “i”,進(jìn)入輸入狀態(tài),寫(xiě)完后按ESC退出輸入狀態(tài),再按“:wq”退出!
成功后,執(zhí)行 git push:
[圖片上傳失敗...(image-796d41-1641457575104)]
查看遠(yuǎn)程倉(cāng)庫(kù),也已撤回T2,readme已回到想要的狀態(tài):
[圖片上傳失敗...(image-aa6264-1641457575104)]
[圖片上傳失敗...(image-767b4c-1641457575104)]
可見(jiàn),revert操作成功后,產(chǎn)生了新的commit記錄,T2對(duì)T1的修改已經(jīng)恢復(fù),現(xiàn)在的readme就是t1提交后的狀態(tài),但同時(shí)demo文件仍然存在,即T3的提交不受影響!
[圖片上傳失敗...(image-d1945d-1641457575104)]
[圖片上傳失敗...(image-990b08-1641457575104)]
但如果你說(shuō),想要和reset一樣,把t2t3的提交也要?jiǎng)h除掉,那你就先revert t3,再revert t2,可以達(dá)到同樣的效果,但這樣一來(lái),為何不直接用reset?如果你說(shuō)既想達(dá)到reset的效果,又想有記錄防止反悔,那這。。。是一個(gè)值得思考的問(wèn)題!
總結(jié):
reset是徹底回退到指定的commit版本,該commit后的所有commit都將被清除,包括提交歷史記錄;
revert僅僅是撤銷(xiāo)指定commit的修改,并不影響后續(xù)的commit,但所撤銷(xiāo)的commit被后續(xù)的commit修改了同一地方則會(huì)產(chǎn)生沖突;
reset執(zhí)行后不會(huì)產(chǎn)生記錄,revert執(zhí)行后會(huì)產(chǎn)生記錄;
reset執(zhí)行后無(wú)法再次恢復(fù),revert執(zhí)行后因?yàn)椴粫?huì)清除記錄,并且會(huì)產(chǎn)生新紀(jì)錄,所以文件不會(huì)丟失,你可以多次執(zhí)行revert恢復(fù)到某次改變之前的狀態(tài);
reset執(zhí)行后HEAD會(huì)后移,而revert的HEAD則一直是向前的;
理清了reset和revert的基本原理,你就明白了在什么時(shí)間該使用哪個(gè)命令更為合適了!
[圖片上傳失敗...(image-a84b6a-1641457575104)]
- Checkout
Git checkout -- 文件名
Reset hard HEAD 文件名,只能在工作區(qū)才能起效果。
擴(kuò)展插件:
SpanTree-gitlab tree
[圖片上傳失敗...(image-2dbc91-1641457575104)]
[圖片上傳失敗...(image-ef4577-1641457575104)]
這樣查看文件就可以方便很多。