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

嘟嘟MD發表於2017-05-26

原本地址:git乾貨系列:(三)我提交錯了我想撤銷或者回退版本
部落格地址:tengj.top/

前言

前面給大家普及了暫存區的概念以及展示的工作區、版本庫中的暫存區和版本庫之間的關係,如果大家都理解的話,那麼今天的課程就很簡單了。
在上圖大家回顧一下,看這裡

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

正文

撤銷操作

 git checkout -- [file]複製程式碼

如果你檔案只是在工作區修改了,但是還沒提交到暫存區的時候,你可以用git checkout -- [file]來撤銷。簡單的說就是暫存區覆蓋工作區。這裡模擬一下,比如現在readme.txt裡面內容是first day,並且已經提交到暫存區了,此時修改readme.txt,內容改成second day.,然後執行git checkout -- readme.txt命令,你會發現readme.txt內容又變成first day

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

 git reset HEAD複製程式碼

如果你檔案在工作區修改了,並且也執行git add命令提交給暫存區了,那麼執行上面的git checkout -- [file]已經無效了,因為工作區跟暫存區已經一樣了,再怎麼覆蓋內容也一樣,這時候就應該使用git reset HEAD命令來撤銷,簡單的說就是讓HEAD覆蓋暫存區,因為此時的HEAD這邊的檔案內容還是上次提交時的內容。現在模擬一下,現在有readme.txthello.txt兩個檔案,都經過修改

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

如圖可以看到,使用git status -s來檢視的時候,紅色的M表示這2個檔案都經過修改,使用git add .提交後在檢視,發現都是綠色的M,表示都提交到暫存區了,這時候執行git reset HEAD hello.txt後在檢視,發現hello.txt變成紅色M了,說明hello.txt從暫存區撤銷了。如果還想把工作區間的檔案也撤回,就繼續執行上面的git reset HEAD readme.txt就行。

 git checkout HEAD [file]複製程式碼

git checkout HEAD [file]命令是git checkout -- [file]git reset HEAD的合成體,直接用HEAD覆蓋工作區,暫存區。如下圖中所示,一開始 工作區暫存區以及HEAD中檔案內容都是first day.,此時修改readme.txt內容為second day.,然後執行git add .提交到暫存區,接著執行git checkout HEAD readme.txt命令,再檢視readme.txt內容的時候你會發現變成了first day.

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

版本回退以及切換

git reset --hard HEAD^複製程式碼

首先,Git必須知道當前版本是哪個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫100個^比較容易數不過來,所以寫成HEAD~100
先檢視當前版本記錄,發現最近的兩個版本為b520a36 第一次提交479c6fd 第二次提交

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

當前版本是b520a36 第一次提交,現在我們來執行git reset --hard HEAD^來回退到479c6fd 第二次提交版本,如圖:

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

 git reset --hard commit_id複製程式碼

如果你回退版本後又後悔了,想恢復最後那個版本怎麼辦,通過git reset --hard commit_id命令可以搞定,注意這裡的commit_id是版本號,只要記得版本號,你想切換到哪個版本都行,如果你忘記了剛才最後一個的版本號,可以通過git reflog來檢視,這裡我們記得最後那次版本號為b520a36,執行git reset --hard b520a36

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

刪除操作


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

git rm複製程式碼

執行git rm命令會同時刪除工作區跟暫存區中的指定檔案,要慎重處理。

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

  1. 還未執行git commit提交到HEAD的時候刪除檔案,這時候直接使用git checkout HEAD [file]就能還原。

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

  2. 執行git commit提交到HAED後時候才刪除檔案,這時候就只能執行git reset --hard HEAD^回退上一個版本。

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

結束


總結一下上面所學的:

場景1:當你改亂了工作區某個檔案的內容,想直接丟棄工作區的修改時,用命令git checkout -- file
場景2:當你不但改亂了工作區某個檔案的內容,還新增到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操作。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,使用git reset --hard HEAD^


一直覺得自己寫的不是技術,而是情懷,一篇篇文章是自己這一路走來的痕跡。靠專業技能的成功是最具可複製性的,希望我的這條路能讓你少走彎路,希望我能幫你抹去知識的蒙塵,希望我能幫你理清知識的脈絡,希望未來技術之巔上有你也有我。

相關文章