談?wù)刧it回退:revert、reset以及checkout

一: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的其他幾種回退方法:

  1. git reset --hard HEAD^

  2. 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ù);

  1. git reset --soft commitId, 還原到<u>暫存區(qū)</u>

[圖片上傳失敗...(image-1c8975-1641457575105)]

  1. 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)]

  1. Checkout

Git checkout -- 文件名

Reset hard HEAD 文件名,只能在工作區(qū)才能起效果。

擴(kuò)展插件:

SpanTree-gitlab tree

[圖片上傳失敗...(image-2dbc91-1641457575104)]

[圖片上傳失敗...(image-ef4577-1641457575104)]

這樣查看文件就可以方便很多。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容