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

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

  1. git reset --hard HEAD^

  2. git reset --hard HEAD~2

^的個數(shù)/~2表示回退的個版本個數(shù)

優(yōu)點:

<u>徹底回退到指定版本香嗓,代碼提交記錄干凈清爽;</u>

<u>提交時間線也清晰沒有冗雜装畅;</u>

缺點:

記錄徹底清除靠娱,無法再次恢復(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í)行后會產(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)]

  1. Checkout

Git checkout -- 文件名

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

擴展插件:

SpanTree-gitlab tree

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市叠萍,隨后出現(xiàn)的幾起案子芝发,更是在濱河造成了極大的恐慌,老刑警劉巖苛谷,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辅鲸,死亡現(xiàn)場離奇詭異,居然都是意外死亡抄腔,警方通過查閱死者的電腦和手機瓢湃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來赫蛇,“玉大人绵患,你說我怎么就攤上這事∥蛟牛” “怎么了落蝙?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長暂幼。 經(jīng)常有香客問我筏勒,道長,這世上最難降的妖魔是什么旺嬉? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任管行,我火速辦了婚禮,結(jié)果婚禮上邪媳,老公的妹妹穿的比我還像新娘捐顷。我一直安慰自己,他們只是感情好雨效,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布迅涮。 她就那樣靜靜地躺著,像睡著了一般徽龟。 火紅的嫁衣襯著肌膚如雪叮姑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天据悔,我揣著相機與錄音传透,去河邊找鬼耘沼。 笑死,一個胖子當(dāng)著我的面吹牛旷祸,可吹牛的內(nèi)容都是我干的耕拷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼托享,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了浸赫?” 一聲冷哼從身側(cè)響起闰围,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎既峡,沒想到半個月后羡榴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡运敢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年校仑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片传惠。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡迄沫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出卦方,到底是詐尸還是另有隱情羊瘩,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布盼砍,位于F島的核電站尘吗,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏浇坐。R本人自食惡果不足惜睬捶,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望近刘。 院中可真熱鬧擒贸,春花似錦、人聲如沸跌宛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疆拘。三九已至蜕猫,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哎迄,已是汗流浹背回右。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工隆圆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人翔烁。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓渺氧,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹬屹。 傳聞我的和親對象是個殘疾皇子侣背,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容