原本地址:git乾貨系列:(三)我提交錯了我想撤銷或者回退版本
部落格地址:tengj.top/
前言
前面給大家普及了暫存區的概念以及展示的工作區、版本庫中的暫存區和版本庫之間的關係,如果大家都理解的話,那麼今天的課程就很簡單了。
在上圖大家回顧一下,看這裡
正文
撤銷操作
git checkout -- [file]複製程式碼
如果你檔案只是在工作區修改了,但是還沒提交到暫存區的時候,你可以用git checkout -- [file]
來撤銷。簡單的說就是暫存區覆蓋工作區。這裡模擬一下,比如現在readme.txt
裡面內容是first day
,並且已經提交到暫存區了,此時修改readme.txt
,內容改成second day.
,然後執行git checkout -- readme.txt
命令,你會發現readme.txt
內容又變成first day
了
git reset HEAD複製程式碼
如果你檔案在工作區修改了,並且也執行git add
命令提交給暫存區了,那麼執行上面的git checkout -- [file]
已經無效了,因為工作區跟暫存區已經一樣了,再怎麼覆蓋內容也一樣,這時候就應該使用git reset HEAD
命令來撤銷,簡單的說就是讓HEAD
覆蓋暫存區,因為此時的HEAD
這邊的檔案內容還是上次提交時的內容。現在模擬一下,現在有readme.txt
跟hello.txt
兩個檔案,都經過修改
如圖可以看到,使用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 reset --hard HEAD^複製程式碼
首先,Git
必須知道當前版本是哪個版本,在Git
中,用HEAD
表示當前版本,也就是最新的提交3628164...882e1e0
(注意我的提交ID和你的肯定不一樣),上一個版本就是HEAD^
,上上一個版本就是HEAD^^
,當然往上100個版本寫100個^
比較容易數不過來,所以寫成HEAD~100
。
先檢視當前版本記錄,發現最近的兩個版本為b520a36 第一次提交
和479c6fd 第二次提交
當前版本是b520a36 第一次提交
,現在我們來執行git reset --hard HEAD^
來回退到479c6fd 第二次提交
版本,如圖:
git reset --hard commit_id複製程式碼
如果你回退版本後又後悔了,想恢復最後那個版本怎麼辦,通過git reset --hard commit_id
命令可以搞定,注意這裡的commit_id
是版本號,只要記得版本號,你想切換到哪個版本都行,如果你忘記了剛才最後一個的版本號,可以通過git reflog
來檢視,這裡我們記得最後那次版本號為b520a36
,執行git reset --hard b520a36
刪除操作
這裡介紹一下git
中的刪除操作命令,以及意外刪除了該如何還原。
git rm複製程式碼
執行git rm
命令會同時刪除工作區跟暫存區中的指定檔案,要慎重處理。
但是如果你意外刪除了也是可以恢復的。不過要分成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^
。
一直覺得自己寫的不是技術,而是情懷,一篇篇文章是自己這一路走來的痕跡。靠專業技能的成功是最具可複製性的,希望我的這條路能讓你少走彎路,希望我能幫你抹去知識的蒙塵,希望我能幫你理清知識的脈絡,希望未來技術之巔上有你也有我。