1. 程式人生 > >Git撤銷修改和版本回退,等相關操作

Git撤銷修改和版本回退,等相關操作

撤銷修改

撤銷修改是指將工作區中的修改撤銷。

語法:git checkout 檔名或路徑

# 撤銷工作區中當前目錄中的所有更改

git checkout .

# 撤銷工作區中指定檔案的修改

git checkout -- filename

git checkout 命令只能撤銷工作區中的修改,而不能撤銷暫存區中的修改。

git checkout 命令還有一個非常重要的功能就是切換分支。可用於分支管理。

# 切換到已經存在的分支

git checkout master

# 切換分支的同時,建立分支

git checkout -b my-dev

這裡,只是簡單說一下 git checkout 如何切換分支,等你需要用到分支管理的時候,自然就明白了。

版本回退

版本回退是指將版本庫從當前版本回退到其他的版本。

語法:git reset --hard 版本號

有時,我們需要將 Git 版本庫回退(還原)到以前的某個版本,可以使用 git reset 命令。

在 Git 中,HEAD 指標指向的是當前版本,也就是最新的 commit id,上一個版本是 HEAD^,上上一個版本就是 HEAD^^,上50個版本可以寫成 HEAD~50。

可以使用下面的命令,將 Git 回退到上一個版本:

這時,我們再來使用 git log 命令檢視版本庫被修改的日誌。卻發現,看不到被回退的版本之後的歷史記錄了。如果,想再回到最新的版本,怎麼辦?

只要剛剛的命令列視窗沒有關掉,你就可以順著往上面找,直到發現最新的版本號(如420882d0676403a6a2),於是,就可以使用下面的命令還原到指定的版本:

版本號(commit id)沒必要寫全,一般寫前七位就夠了,Git會自動去匹配。

但是,假如你回退到了某個版本後,把電腦關了。第二天又後悔了,想要恢復到最新版本。

這時,可以使用命令 git reflog 來檢視你的每一次操作日誌,該命令可以輸出對應的版本號的操作記錄。這樣,我們就可以恢復到任意版本了。

git reset 的選項

git reset 有很多可用的選項。可以通過幫助命令來檢視。

其中,最常用的三個選項是:

--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 diff 命令。

git diff .

git diff filename

檢視工作區和版本庫的區別

如果你只是修改了工作區,還沒有 git add 到暫存區,想要檢視工作區和版本庫的區別。

# 檢視工作區和版本庫的區別

gitdiff

上述命令只能檢視到工作區中已經存在的檔案的修改,如果是新建立的檔案,它追蹤不到。如果修改和新檔案已經 git add 到了暫存區,就需要使用下面的命令來檢視。

檢視暫存區和版本庫的區別

如果你修改了工作區,已經 git add 到了暫存區,想要檢視暫存區和版本庫的區別。

檢視兩個版本之間的區別

如果你修改了工作區,已經 git add 到了暫存區,並且 git commit 到了版本庫。這樣 head 指標就指向了最新的版本。想要比較兩個版本之間的區別。

語法: git diff 版本號1 版本號2

# 比較兩個版本之間的差異

git diff 41295230a7d9af

在這個例子中,412952 是上一個版本的版本號,0a7d9af 是當前的版本號(最新版本號)。只取前 7 位就夠了。

# 比較之前的版本和當前版本的差異

git diff 4129523head

# 比較某個檔案在兩個版本之間的差異

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 log 命令預設會進入日誌檢視模式,可按 q 退出檢視模式。

git log 命令會顯示從最近到最遠的提交日誌,每一行的前面的一大串字元就是 commit id(版本號),它和 SVN 的版本號不一樣,Git 的版本號不是遞增的數字,而是一個 SHA1 加密計算出來的一個非常大的數字,用十六進位制表示。

場景分析

場景一

假如你只是修改了工作區,還沒有 git add 到暫存區。可以使用下面的命令撤銷工作區中的修改。

# 僅僅是撤銷工作區中的修改

gitcheckout .

場景二

假如你修改了工作區,並把工作區中的修改 git add 到了暫存區。

如果你想撤銷工作區和暫存區中的修改。

git reset --hard head

# 簡寫為

git reset--hard

如果你僅僅只是想要撤銷暫存區中的修改。

git reset --mixed

# 簡寫為

git reset

場景三

假如你修改了工作區,並把工作區中的修改 git add 到了暫存區,然後又 git commit 提交到了版本庫。

如果你想回退到上一個版本,可以使用下面的命令。

檢視當前的版本號,可以使用。

需要注意的是,在 Windows 的 CMD 中, ^ 代表換行,即命令沒輸完,在下一行繼續輸命令。它相當於 Linux 中的 \ 。

因此,在 CMD 中回退到上一個版本的寫法,就略有不同。

具體的解決方法有:

git reset --hard "head^"

git reset --hard HEAD^^

git reset --hard HEAD~

git reset --hard HEAD~1

改用 PowerShell 或 Git Bash 終端

還有一個需要注意的問題是,通常我們所說的版本回退是指完整的版本回退。

如果你回退版本時,採用的是 『 git reset --mixed 版本號 』,--mixed 其實本來就是預設選項。那麼,你只是更改了 head 的指向和回退了暫存區,而並沒有回退工作區。如果想要繼續把工作區也回退,你還需執行下面的命令

這樣,才算完整的版本回退。

完整的版本回退,包含三個要素:

更改 HEAD 指標的指向(即讓 HEAD 指向目標版本)

回退工作區(即工作區中的內容也要回退到目標版本)

回退暫存區(即暫存區中的內容也要回退到目標版本)

為此,推薦使用 git reset --hard 來完成版本回退。