本來地址: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.txt
跟hello.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種狀況處理:
還未執行git commit
提交到HEAD
的時候刪除文件,這時候直接使用git checkout HEAD [file]
就能還原。
執行git commit
提交到HAED
後時候才刪除文件,這時候就只能執行git reset --hard HEAD^
回退上一個版本。
總結一下上面所學的:
場景1:當你改亂了工做區某個文件的內容,想直接丟棄工做區的修改時,用命令git checkout -- file
。
場景2:當你不但改亂了工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,第一步用命令git reset HEAD file
,就回到了場景1,第二步按場景1操做。
場景3:已經提交了不合適的修改到版本庫時,想要撤銷本次提交,使用git reset --hard HEAD^
。
一直以爲本身寫的不是技術,而是情懷,一篇篇文章是本身這一路走來的痕跡。靠專業技能的成功是最具可複製性的,但願個人這條路能讓你少走彎路,但願我能幫你抹去知識的蒙塵,但願我能幫你理清知識的脈絡,但願將來技術之巔上有你也有我。