前言
前面給大家普及了暫存區(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.txt
跟hello.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種情況處理:
-
還未執(zhí)行
git commit
提交到HEAD
的時(shí)候刪除文件,這時(shí)候直接使用git checkout HEAD [file]
就能還原。
-
執(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ù)之巔上有你也有我。