git干貨系列:(三)我提交錯(cuò)了我想撤銷或者回退版本

前言


前面給大家普及了暫存區(qū)的概念以及展示的工作區(qū)、版本庫(kù)中的暫存區(qū)和版本庫(kù)之間的關(guān)系,如果大家都理解的話,那么今天的課程就很簡(jiǎn)單了。
在上圖大家回顧一下,看這里


正文


撤銷操作

 git checkout -- [file]

如果你文件只是在工作區(qū)修改了,但是還沒提交到暫存區(qū)的時(shí)候,你可以用git checkout -- [file]來(lái)撤銷。簡(jiǎn)單的說(shuō)就是暫存區(qū)覆蓋工作區(qū)。這里模擬一下,比如現(xiàn)在readme.txt里面內(nèi)容是first day,并且已經(jīng)提交到暫存區(qū)了,此時(shí)修改readme.txt,內(nèi)容改成second day.,然后執(zhí)行git checkout -- readme.txt命令,你會(huì)發(fā)現(xiàn)readme.txt內(nèi)容又變成first day

 git reset HEAD

如果你文件在工作區(qū)修改了,并且也執(zhí)行git add命令提交給暫存區(qū)了,那么執(zhí)行上面的git checkout -- [file]已經(jīng)無(wú)效了,因?yàn)楣ぷ鲄^(qū)跟暫存區(qū)已經(jīng)一樣了,再怎么覆蓋內(nèi)容也一樣,這時(shí)候就應(yīng)該使用git reset HEAD命令來(lái)撤銷,簡(jiǎn)單的說(shuō)就是讓HEAD覆蓋暫存區(qū),因?yàn)榇藭r(shí)的HEAD這邊的文件內(nèi)容還是上次提交時(shí)的內(nèi)容。現(xiàn)在模擬一下,現(xiàn)在有readme.txthello.txt兩個(gè)文件,都經(jīng)過(guò)修改


如圖可以看到,使用git status -s來(lái)查看的時(shí)候,紅色的M表示這2個(gè)文件都經(jīng)過(guò)修改,使用git add .提交后在查看,發(fā)現(xiàn)都是綠色的M,表示都提交到暫存區(qū)了,這時(shí)候執(zhí)行git reset HEAD hello.txt后在查看,發(fā)現(xiàn)hello.txt變成紅色M了,說(shuō)明hello.txt從暫存區(qū)撤銷了。如果還想把工作區(qū)間的文件也撤回,就繼續(xù)執(zhí)行上面的git reset HEAD readme.txt就行。

 git checkout HEAD [file]

git checkout HEAD [file]命令是git checkout -- [file]git reset HEAD的合成體,直接用HEAD覆蓋工作區(qū),暫存區(qū)。如下圖中所示,一開始 工作區(qū)暫存區(qū)以及HEAD中文件內(nèi)容都是first day.,此時(shí)修改readme.txt內(nèi)容為second day.,然后執(zhí)行git add .提交到暫存區(qū),接著執(zhí)行git checkout HEAD readme.txt命令,再查看readme.txt內(nèi)容的時(shí)候你會(huì)發(fā)現(xiàn)變成了first day.

版本回退以及切換

git reset --hard HEAD^

首先,Git必須知道當(dāng)前版本是哪個(gè)版本,在Git中,用HEAD表示當(dāng)前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個(gè)版本就是HEAD^,上上一個(gè)版本就是HEAD^^,當(dāng)然往上100個(gè)版本寫100個(gè)^比較容易數(shù)不過(guò)來(lái),所以寫成HEAD~100
先查看當(dāng)前版本記錄,發(fā)現(xiàn)最近的兩個(gè)版本為b520a36 第一次提交479c6fd 第二次提交

當(dāng)前版本是b520a36 第一次提交,現(xiàn)在我們來(lái)執(zhí)行git reset --hard HEAD^來(lái)回退到479c6fd 第二次提交版本,如圖:

 git reset --hard commit_id  

如果你回退版本后又后悔了,想恢復(fù)最后那個(gè)版本怎么辦,通過(guò)git reset --hard commit_id命令可以搞定,注意這里的commit_id是版本號(hào),只要記得版本號(hào),你想切換到哪個(gè)版本都行,如果你忘記了剛才最后一個(gè)的版本號(hào),可以通過(guò)git reflog來(lái)查看,這里我們記得最后那次版本號(hào)為b520a36,執(zhí)行git reset --hard b520a36

刪除操作


這里介紹一下git中的刪除操作命令,以及意外刪除了該如何還原。

git rm

執(zhí)行git rm命令會(huì)同時(shí)刪除工作區(qū)跟暫存區(qū)中的指定文件,要慎重處理。

但是如果你意外刪除了也是可以恢復(fù)的。不過(guò)要分成2種情況處理:

  1. 還未執(zhí)行git commit提交到HEAD的時(shí)候刪除文件,這時(shí)候直接使用git checkout HEAD [file]就能還原。

  2. 執(zhí)行git commit提交到HAED后時(shí)候才刪除文件,這時(shí)候就只能執(zhí)行git reset --hard HEAD^回退上一個(gè)版本。

結(jié)束


總結(jié)一下上面所學(xué)的:

場(chǎng)景1:當(dāng)你改亂了工作區(qū)某個(gè)文件的內(nèi)容,想直接丟棄工作區(qū)的修改時(shí),用命令git checkout -- file
場(chǎng)景2:當(dāng)你不但改亂了工作區(qū)某個(gè)文件的內(nèi)容,還添加到了暫存區(qū)時(shí),想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場(chǎng)景1,第二步按場(chǎng)景1操作。
場(chǎng)景3:已經(jīng)提交了不合適的修改到版本庫(kù)時(shí),想要撤銷本次提交,使用git reset --hard HEAD^


一直覺得自己寫的不是技術(shù),而是情懷,一篇篇文章是自己這一路走來(lái)的痕跡。靠專業(yè)技能的成功是最具可復(fù)制性的,希望我的這條路能讓你少走彎路,希望我能幫你抹去知識(shí)的蒙塵,希望我能幫你理清知識(shí)的脈絡(luò),希望未來(lái)技術(shù)之巔上有你也有我。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • GIT分布式版本控制系統(tǒng)最佳實(shí)踐 這篇文章來(lái)自于老男孩教育高級(jí)架構(gòu)師班12期的徐亮偉同學(xué)。 首先感謝老男孩架構(gòu)師班...
    meng_philip123閱讀 3,508評(píng)論 4 36
  • 問(wèn)曰:霾何以生成之? 紫極曰:《經(jīng)》云:天氣清凈光明者也,藏德不止,故不下也。天明則日月不明,邪害空竅。陽(yáng)氣者閉塞...
    松本靜閱讀 984評(píng)論 0 0
  • 是風(fēng)是雨—— 只一夜栗色身上 滿是雪花翠玉 太陽(yáng)不將這雪花融化 紅花也向他無(wú)理爭(zhēng)謂 天上云彩華麗 地上綠草悠悠 點(diǎn)...
    蘇如蕤閱讀 333評(píng)論 0 1
  • 老師叫我們寫綠豆發(fā)芽記,于是,我就買了一些綠豆。 聽媽媽說(shuō), 首先,把綠豆放進(jìn)碗里,加點(diǎn)水,把沙子...
    稻香奶茶閱讀 970評(píng)論 2 3