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

本來地址:git乾貨系列:(三)我提交錯了我想撤銷或者回退版本
博客地址:tengj.top/javascript

前言

前面給你們普及了暫存區的概念以及展現的工做區、版本庫中的暫存區和版本庫之間的關係,若是你們都理解的話,那麼今天的課程就很簡單了。
在上圖你們回顧一下,看這裏
java

正文

撤銷操做

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兩個文件,都通過修改
spa


如圖能夠看到,使用 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.
3d

版本回退以及切換

git reset --hard HEAD^複製代碼

首先,Git必須知道當前版本是哪一個版本,在Git中,用HEAD表示當前版本,也就是最新的提交3628164...882e1e0(注意個人提交ID和你的確定不同),上一個版本就是HEAD^,上上一個版本就是HEAD^^,固然往上100個版本寫100個^比較容易數不過來,因此寫成HEAD~100
先查看當前版本記錄,發現最近的兩個版本爲b520a36 第一次提交479c6fd 第二次提交
code

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

git reset --hard commit_id複製代碼

若是你回退版本後又後悔了,想恢復最後那個版本怎麼辦,經過git reset --hard commit_id命令能夠搞定,注意這裏的commit_id是版本號,只要記得版本號,你想切換到哪一個版本都行,若是你忘記了剛纔最後一個的版本號,能夠經過git reflog來查看,這裏咱們記得最後那次版本號爲b520a36,執行git reset --hard b520a36
blog

刪除操做


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

git rm複製代碼

執行git rm命令會同時刪除工做區跟暫存區中的指定文件,要慎重處理。get

可是若是你意外刪除了也是能夠恢復的。不過要分紅2種狀況處理:

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

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

結束


總結一下上面所學的:

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


一直以爲本身寫的不是技術,而是情懷,一篇篇文章是本身這一路走來的痕跡。靠專業技能的成功是最具可複製性的,但願個人這條路能讓你少走彎路,但願我能幫你抹去知識的蒙塵,但願我能幫你理清知識的脈絡,但願將來技術之巔上有你也有我。

相關文章
相關標籤/搜索