如何高效撤銷Git管理的檔案在各種狀態下的更改

阿豪聊乾貨發表於2017-12-29

一、背景

  企業中我們一般採用分散式版本管理工具git來進行版本管理,在團隊協作的過程中,我們難免會遇到誤操作,需要撤銷更改的情況,那麼我們怎麼高效的進行撤銷修改呢?對於還未提交到暫存區的程式碼怎麼高效撤銷更改呢?對於已經提交到暫存區的程式碼,怎麼取消add操作?對於已經提交到本地倉庫,還沒有提交到遠端倉庫的程式碼,怎麼進行高效撤銷更改呢?還有對於已經提交到遠端倉庫的程式碼,如何進行高效的撤銷更改呢?那我們本文就來一一解決這些棘手的問題!

二、各種狀態高效撤銷方案

  1. 檔案還未提交到暫存區,只是在工作目錄中修改了,想要撤銷

    git checkout [--] file-name (撤銷單個檔案修改)
    git checkout [--] . (撤銷當前工作空間中所有檔案的修改)
  2. 檔案已經add到暫存區,但還沒有提交到本地倉庫,想要撤銷(即取消add操作)
    git reset [HEAD] file-name (撤銷暫存區中的單個檔案)
    git reset [HEAD] . (撤銷當前暫存區中的所有內容)
  3. 檔案已經提交到本地倉庫,但還沒有push到遠端倉庫,想要撤銷

    git log (檢視並記錄下要回滾到的commitId)
    git reset [--soft | --mixed |--hard] commitId (回退版本)

      注:git reset 預設是 --mixed 模式,即 git reset --mixed 等價於 git reset.

        --soft : 會保留工作區間以及暫存區index的提交,只是把git commit回退到某個版本,如還需提交,直接commit即可。

        --mixed : 會在工作區保留原始碼,只是將git commit和暫存區index回退到某個版本。

        --hard : 原始碼以及暫存區和git commit都回退到某個版本。

  4. 檔案已經提交到遠端倉庫,想要撤銷

    git log (檢視並記錄下要回滾到的commitId)
    git reset --hard commitId (回退版本)
    git push -f origin branch-name


    git revert commitId(回退版本)
    git push origin branch-name

   注: reset和revert有著本質的區別,reset直接刪除了指定的commit,而revert是用一次新的commit來覆蓋要回滾的commit.

      reset 是在正常的commit歷史中,刪除了指定的commit,這時 HEAD 是向後移動了,而 revert 是在正常的commit歷史中再commit一次,只不過是反向提交,他的 HEAD 是一直向前的.

        如果在日後現有分支和歷史分支需要合併的時候,reset 恢復部分的程式碼依然會出現在歷史分支裡.但是revert 方向提交的commit 並不會出現在歷史分支裡.  

三、總結

  通過本文我們就知道如何對不同狀態的git管理的檔案進行撤銷修改的操作,這樣即使我們不小心操作了什麼東西,我們也能很快的進行回滾,就是要做高效的程式猿~

相關文章