一:reset 和 revert的區(qū)別
Reset是回退到某個指定的節(jié)點,往后的一律消失鳄厌;
Revert是撤回某個指定的節(jié)點荞胡,剩下的提交記錄都還在,包括操作的revert節(jié)點了嚎;
二:談?wù)凴eset 涉及的屬性
舉例:
新建一個文件泪漂,并輸入文字然后提交:
GIT查看提交記錄就會出現(xiàn)第一次提交:
提交后查看遠程倉庫目錄及文件內(nèi)容:
[圖片上傳失敗...(image-61bd8f-1641457575108)]
再次修改readme.txt文件,并提交到遠程倉庫
[圖片上傳失敗...(image-ce7452-1641457575107)]
[圖片上傳失敗...(image-25c576-1641457575107)]
查看遠程倉庫是否正確提交:
[圖片上傳失敗...(image-fc0b3d-1641457575107)]
[圖片上傳失敗...(image-dd4ac9-1641457575107)]
現(xiàn)在再新增一個test.html文件歪泳,并把他推送到遠程倉庫
[圖片上傳失敗...(image-f5673a-1641457575106)]
[圖片上傳失敗...(image-e006bf-1641457575106)]
再次查看遠程倉庫和提交記錄
[圖片上傳失敗...(image-7ab916-1641457575106)]
[圖片上傳失敗...(image-6807f2-1641457575106)]
這時需要變更:不要test也不要readme上的第二次修改的內(nèi)容萝勤,需要版本回退到第一次提交的‘T1’,那用reset操作 → git reset --hard commitId
[圖片上傳失敗...(image-1d6562-1641457575106)]
此時本地test已刪除夹囚,readme也回到了第一次提交的記錄纵刘,但是查看遠程依然是最新的代碼并沒有回退,那么需要本來push來更新荸哟。
[圖片上傳失敗...(image-5c31bf-1641457575106)]
[圖片上傳失敗...(image-3f38e0-1641457575106)]
當(dāng)我執(zhí)行g(shù)it push會失敗假哎,因為本地代碼回到了舊版本,但遠程倉庫是新版本和本地不一致鞍历,所以當(dāng)我用git push時會報錯舵抹,這里我們需要使用強制提交:git push -f
[圖片上傳失敗...(image-e3f84a-1641457575106)]
再看遠程倉庫已回退
[圖片上傳失敗...(image-e7e651-1641457575106)]
這個時候看提交記錄也回到了第一次提交,后面的記錄都沒了
[圖片上傳失敗...(image-294a32-1641457575106)]
可見劣砍,reset是徹徹底底的回退惧蛹,該commit之后的所有修改將完全消失,包括提交記錄刑枝。
Reset hard的其他幾種回退方法:
git reset --hard HEAD^
git reset --hard HEAD~2
^的個數(shù)/~2表示回退的個版本個數(shù)
優(yōu)點:
<u>徹底回退到指定版本香嗓,代碼提交記錄干凈清爽;</u>
<u>提交時間線也清晰沒有冗雜装畅;</u>
缺點:
記錄徹底清除靠娱,無法再次恢復(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í)行后會產(chǎn)生新的commit記錄掠兄,是通過一次新的commit來恢復(fù)到之前舊的commit像云,但revert會保留恢復(fù)的該次提交后面的其它提交內(nèi)容锌雀,假如后面的提交與要恢復(fù)的提交更改了同一地方,此時用revert就會產(chǎn)生沖突!
我們把上面的三次提交再操作一次迅诬;
[圖片上傳失敗...(image-c62a58-1641457575105)]
[圖片上傳失敗...(image-21d1da-1641457575105)]
[圖片上傳失敗...(image-dd070c-1641457575105)]
此時我們用reset的思路來回退到第一次提交腋逆,命令行 → Git revert commitId
[圖片上傳失敗...(image-f0e78b-1641457575105)]
如上所示<u>沖突</u>了,當(dāng)前內(nèi)容是第2次提交侈贷,而我們要恢復(fù)的內(nèi)容是read 1
如果對revert命令沒有深入了解的話惩歉,就可能會產(chǎn)生疑惑,為什么會沖突铐维?而且我實際上是想像reset一樣恢復(fù)或者說是回退到T1(這里要再次說明一下第一次提交的狀態(tài):只有一個readme文件柬泽,且內(nèi)容是第一次提交),但為什么沖突提示要恢復(fù)到read 1.嫁蛇?锨并??這是初始第一次寫的睬棚。
其實第煮,準確來說,revert是撤銷/撤回/反提交的意思抑党,我們不能按reset的思路理解包警,我們執(zhí)行g(shù)it revert T1,這么做其實結(jié)果是要撤銷第一次的提交底靠,注意害晦,僅僅是撤銷T1的提交,把T1的修改恢復(fù)到T1之前也就是初始的狀態(tài)暑中,而不會影響T2壹瘟,T3的提交。但如果T2鳄逾,T3中修改了T1修改的同一地方稻轨,那么就會產(chǎn)生沖突,因為revert意圖撤銷T1的修改雕凹,但發(fā)現(xiàn)T2和T3把T1的修改再次修改了殴俱,此時,revert意圖變得不清晰枚抵,因為它無法確定到底是應(yīng)用你最新的修改线欲,還是恢復(fù)到初始狀態(tài),這將由你來決定汽摹!
那如果我們要恢復(fù)T1的狀態(tài)询筏,那需要撤銷T2來對T1進行修改 git revert T2:
[圖片上傳失敗...(image-1eab7-1641457575104)]
這里需要我們修改或輸入提交日志,按 “i”竖慧,進入輸入狀態(tài)嫌套,寫完后按ESC退出輸入狀態(tài),再按“:wq”退出圾旨!
成功后踱讨,執(zhí)行 git push:
[圖片上傳失敗...(image-796d41-1641457575104)]
查看遠程倉庫,也已撤回T2砍的,readme已回到想要的狀態(tài):
[圖片上傳失敗...(image-aa6264-1641457575104)]
[圖片上傳失敗...(image-767b4c-1641457575104)]
可見痹筛,revert操作成功后,產(chǎn)生了新的commit記錄廓鞠,T2對T1的修改已經(jīng)恢復(fù)帚稠,現(xiàn)在的readme就是t1提交后的狀態(tài),但同時demo文件仍然存在床佳,即T3的提交不受影響滋早!
[圖片上傳失敗...(image-d1945d-1641457575104)]
[圖片上傳失敗...(image-990b08-1641457575104)]
但如果你說,想要和reset一樣砌们,把t2t3的提交也要刪除掉杆麸,那你就先revert t3,再revert t2浪感,可以達到同樣的效果昔头,但這樣一來,為何不直接用reset影兽?如果你說既想達到reset的效果揭斧,又想有記錄防止反悔,那這峻堰。讹开。。是一個值得思考的問題茧妒!
總結(jié):
reset是徹底回退到指定的commit版本萧吠,該commit后的所有commit都將被清除,包括提交歷史記錄桐筏;
revert僅僅是撤銷指定commit的修改纸型,并不影響后續(xù)的commit,但所撤銷的commit被后續(xù)的commit修改了同一地方則會產(chǎn)生沖突梅忌;
reset執(zhí)行后不會產(chǎn)生記錄狰腌,revert執(zhí)行后會產(chǎn)生記錄;
reset執(zhí)行后無法再次恢復(fù)牧氮,revert執(zhí)行后因為不會清除記錄琼腔,并且會產(chǎn)生新紀錄,所以文件不會丟失踱葛,你可以多次執(zhí)行revert恢復(fù)到某次改變之前的狀態(tài)丹莲;
reset執(zhí)行后HEAD會后移光坝,而revert的HEAD則一直是向前的;
理清了reset和revert的基本原理甥材,你就明白了在什么時間該使用哪個命令更為合適了盯另!
[圖片上傳失敗...(image-a84b6a-1641457575104)]
- Checkout
Git checkout -- 文件名
Reset hard HEAD 文件名,只能在工作區(qū)才能起效果洲赵。
擴展插件:
SpanTree-gitlab tree
[圖片上傳失敗...(image-2dbc91-1641457575104)]
[圖片上傳失敗...(image-ef4577-1641457575104)]
這樣查看文件就可以方便很多鸳惯。