Git 撤銷修改和版本回退
撤銷修改
# 撤銷修改是指將工作區中的修改撤銷 git checkout [檔名或路徑] # 1、撤銷工作區中當前目錄中的所有修改 git checkout . # 2、撤銷工作區中指定檔案的修改 git checkout -- filename
注意:checkout命令只能撤銷工作區中的修改,不能撤銷暫存區中的修改
git checkout命令還有一個非常重要的作用就是切換分支,可用於分支管理
# 1、切換到指定分支(如果分支在本地不存在,會自動從遠端倉庫拉取) git checkout dev # 2、切換分支的同時建立分支 git checkout -b dev
版本回退
# 版本回退是指將版本庫從當前版本回退到其他版本 git reset -- hard 版本號
有時,我們需要將Git版本回退(還原)到以前的某個版本,可以使用 git reset 命令
在git中,HEAD指標指向的是當前版本,也就是最新的conmit id,上一個版本是 HEAD^,上上個版本就是 HEAD^^,上50個版本可以寫作HEAD~50 。
# 可以使用下面的命令,回退到上一個版本 git reset --hard HEAD^
這時,我們再使用 git log 命令檢視版本庫被修改的日誌。卻發現,看不到被回退的版本之後的歷史記錄了。 如果,想再回到最新的版本,怎麼辦?
只要剛剛的命令列視窗沒有關掉,你就可以順著往上面找,直到發現最新的版本號(如4b2a0c88a2d03675694013ac6a2bd6f55c830cdc),
# 就可以使用下面的命令還原到指定的版本,版本號(commit id)沒必要寫全,一般寫前七位就夠了,Git會自動去匹配: git reset --hard 4b2a0c8
但是,假如你回退到了某個版本後,把電腦關了。第二天又後悔了,想要恢復到最新版本。
這時,可以使用命令 git reflog 來檢視你的每一次操作日誌,該命令可以輸出對應的版本號的操作記錄。這樣,我們就可以恢復到任意版本了。
語法:git reset options
git reset 有很多可用選項,可以使用命令 git reset -h 來檢視
其中最常用的三個選項是:
- --mixed: reset HEAD and index。表示重置 HEAD 指標和 index 暫存區,但保持工作區不變。它是預設選項。
- --soft: reset only HEAD。表示僅僅重置 HEAD 指標,即只改變 HEAD 的指向,但保持工作區和暫存區不變。
- --hard: reset HEAD, index and working tree。表示重置 HEAD 指標、index 暫存區和工作區。這個才是完整的版本回退。
-
檢視版本庫的狀態
語法:git status
git status 命令非常有用。它可以檢視版本庫的當前狀態,還可以看到相關操作的提示資訊。
-
檢視修改
# 如果你修改了工作區中的某些檔案,想要檢視具體更改了什麼內容,可以使用 git diff 命令 git diff . git diff filename
-
檢視工作區和版本庫的區別
# 如果你只是修改了工作區,還沒有 git add 到暫存區,想要檢視工作區和版本庫的區別。 # 檢視工作區和版本庫的區別 git diff
上述命令只能檢視到工作區中 已經存在的檔案的修改,如果是新建立的檔案,它追蹤不到。如果修改和新檔案已經 git add 到了暫存區,就需要使用下面的命令來檢視。
-
檢視暫存區和版本庫的區別
# 如果你修改了工作區,已經 git add 到了暫存區,想要檢視暫存區和版本庫的區別。 git diff --cached
-
檢視兩個版本之間的區別
如果你修改了工作區,已經 git add 到了暫存區,並且 git commit 到了版本庫。這樣 head 指標就指向了最新的版本。想要比較兩個版本之間的區別。
語法: git diff [版本號1] [版本號2]
# 比較兩個版本之間的差異 git diff 4129523 0a7d9af # 4129523:表示上一個版本號 # 0a7d9af:當前版本號(最新版本號) # 比較之前的版本和當前版本的差異 git diff 4129523 head # 比較某個檔案在兩個版本之間的差異 git diff 09d9b45 head ./config/app.php # 比較之前的版本和當前版本的差異的簡寫形式 git diff 4129523
-
檢視本地的兩個分支的區別
語法:git diff [branch1] [branch2]
# 比較develop分支和master分支的區別 git diff develop master
-
檢視本地分支和遠端分支的區別
# 對比本地的develop分支和遠端master分支的區別 git diff develop origin/master
-
檢視版本庫的歷史記錄
如果你想檢視版本庫提交的歷史記錄,可以使用 git log 命令。
# 檢視版本庫的歷史記錄 git log # 檢視版本庫的歷史記錄,美化輸出 git log --pretty=oneline # 檢視版本庫的歷史記錄,只顯示前 5 條 git log -5 git log -5 --pretty=oneline
場景分析
場景一
- 假如你只是修改了工作區,還沒有 git add 到暫存區。可以使用下面的命令撤銷工作區中的修改。
# 僅僅是撤銷工作區中的修改 git checkout .
場景二
- 假如你修改了工作區,並把工作區中的修改 git add 到了暫存區
# 如果你想撤銷工作區和暫存區中的修改。 git reset --hard HEAD # 簡寫為 git reset --hard # 如果你僅僅只是想要撤銷暫存區中的修改。 git reset --mixed # 簡寫為 git reset
場景三
- 假如你修改了工作區,並把工作區中的修改 git add 到了暫存區,然後又 git commit 提交到了版本庫。
# 如果你想回退到上一個版本,可以使用下面的命令。 git reset --hard HEAD^ # 檢視當前的版本號,可以使用。 git rev-parse HEAD
說明:完整的版本回退,包含三個要素:
- 更改 HEAD 指標的指向(即讓 HEAD 指向目標版本)
- 回退暫存區(即暫存區中的內容也要回退到目標版本)
- 回退工作區(即工作區中的內容也要回退到目標版本)