git的時光穿梭

版本回退

當初始化一個git倉庫后,.git文件就是你的版本庫。你工作的文件目錄被稱為工作區(qū),而.git文件中存在一個被稱為stage(或者叫index)的暫存區(qū)。我們工作的大概流程一般是修改工作區(qū)的文件,執(zhí)行 git add 文件名,將改動添加到暫存區(qū),確認無誤后執(zhí)行git commit -m "xxx",再將暫存區(qū)的內容提交到主分支。但是如果在這之中出現了錯誤想撤銷上一步操作我們應該怎么辦呢?這里分三種情況:

撤銷工作區(qū)的修改

命令git checkout -- 文件名意思就是,把文件在工作區(qū)的修改全部撤銷,這里又分兩種情況:

一種是文件自修改后還沒有被放到暫存區(qū),現在,撤銷修改就回到和版本庫一模一樣的狀態(tài);

一種是文件已經添加到暫存區(qū)后,又作了修改,現在,撤銷修改就回到添加到暫存區(qū)后的狀態(tài)。

總之,就是讓這個文件回到最近一次git commit或git add時的狀態(tài)。

撤銷暫存區(qū)的修改

如果你發(fā)現添加到暫存區(qū)的代碼出現了bug,那么這時候用命令git reset HEAD 文件名可以把暫存區(qū)的修改撤銷掉(unstage),重新放回工作區(qū)。
其實這時候你工作區(qū)的代碼是有問題的,所以你可以用上面介紹的命令git checkout -- 文件名將工作區(qū)的修改撤銷。

撤銷版本庫的修改

$ git reset --hard HEAD^可以回退到上一個版本,使用git log命令可以查看commit的歷史記錄和id,$ git reset --hard id前幾位就可以回退到想要的版本。具體用法請看下面。

$ git reset命令的用法

我們先用git log命令查看commit日志,以下測試代碼都以這個主分支為基準

$ git log
commit 8f15b4cc534c83d2baf3b312d28c1c78f511fd81
Author: Elemento <18733660998@163.com>
Date:   Tue Jul 25 11:38:56 2017 +0800

    添加c

commit 6283e2a3c0e0406b8f055ce16215efcbb55573d7
Author: Elemento <18733660998@163.com>
Date:   Tue Jul 25 11:38:32 2017 +0800

    添加b

commit a78a9273893b6b14ab2438e74abcf32b3c9484fe
Author: Elemento <18733660998@163.com>
Date:   Tue Jul 25 11:37:57 2017 +0800

    添加a

回退版本庫

使用git reset命令回退兩個版本

$ git reset head~2
Unstaged changes after reset:
M       test.txt

$ git log
commit a78a9273893b6b14ab2438e74abcf32b3c9484fe
Author: Elemento <18733660998@163.com>
Date:   Tue Jul 25 11:37:57 2017 +0800

    添加a

回退工作區(qū)和暫存區(qū)

想要 選擇性的回退 這兩部分則要添加一些參數,比如--soft、--mixed、--hard

  • --soft: 暫存區(qū)和工作區(qū)都不回退 (建議在命令行執(zhí)行后,再輸入 git status 查看狀態(tài))
  • --mixed: 暫存區(qū)回退, 工作區(qū)不回退?!具@是默認選項】(建議同上)
  • --hard:暫存區(qū)和工作區(qū)都將回退

測試--soft參數

$ git reset --soft head^

$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   test.txt
//只有版本庫回退了,暫存區(qū)中仍有add的內容

測試--mixed參數

$ git reset --mixed head^
Unstaged changes after reset:
M       test.txt

$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   test.txt

no changes added to commit (use "git add" and/or "git commit -a")

//現在版本庫和暫存區(qū)都回退了,工作區(qū)的內容是修改過的,暫未add到暫存區(qū),暫存區(qū)為空

測試--hard參數

$ git reset --hard head^
HEAD is now at 6283e2a 添加b

$ git status
On branch master
nothing to commit, working directory clean

//現在版本庫、暫存區(qū)和工作區(qū)都回退了

更新中,待續(xù)...


參考了廖雪峰的官方網站以及git reset, git checkout, git revert 區(qū)別,本文只作為平時的學習筆記。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容