版本回退
當初始化一個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ū)別,本文只作為平時的學習筆記。