【學了就忘】Git後悔藥 — 34.版本回退操作(三)

(3)git reset --hard命令

git reset --hardcommit-id命令:回退到指定版本。(hard:強硬,嚴格的回退)

該命令不僅移動了分支中HEAD指針的位置,還將工作區和暫存區中數據也回退到了指定的版本。

(提示:該命令慎用。)

示例開始:

首先在版本庫中的readme.txt文件中添加一行內容,並提交該內容。我們的目的就是要再回退到該版本。

1)查看本地版本庫日誌

# 1.使用git log查看歷史版本記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline
529ad74 (HEAD -> master) 第3次提交,新增內容:readme.txt file v3
1b23cae 第2次提交,新增內容:readme.txt file v2
2612adf 第1次提交,創建readme.txt文件

# 2.使用git reflog查看歷史版本記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reflog
529ad74 (HEAD -> master) HEAD@{0}: commit: 第3次提交,新增內容:readme.txt file v3
1b23cae HEAD@{1}: commit: 第2次提交,新增內容:readme.txt file v2
2612adf HEAD@{2}: commit (initial): 第1次提交,創建readme.txt文件

# 3.查看readme.txt文件的內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat readme.txt
readme.txt file v1
readme.txt file v2
readme.txt file v3

2)向readme.txt文件中新增一行數據,並提交到本地版本庫

# 1.新增數據
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ echo "readme.txt file v4" >> readme.txt

# 2.查看readme.txt文件內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat readme.txt
readme.txt file v1
readme.txt file v2
readme.txt file v3
readme.txt file v4

# 3.提交到本地版本庫
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git commit -a -m '第4次提交,新增內容:readme.txt file v4'
warning: LF will be replaced by CRLF in readme.txt.
The file will have its original line endings in your working directory
[master e72b30f] 第4次提交,新增內容:readme.txt file v4
 1 file changed, 1 insertion(+)

# 4.現在查看此時本地版本庫日誌
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline
e72b30f (HEAD -> master) 第4次提交,新增內容:readme.txt file v4
529ad74 第3次提交,新增內容:readme.txt file v3
1b23cae 第2次提交,新增內容:readme.txt file v2
2612adf 第1次提交,創建readme.txt文件

3)現在比對工作區與暫存區、暫存區與本地版本庫的差異

# 1.比對工作區與暫存區中文件的差異
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff readme.txt

# 2.比對暫存區與本地版本庫中文件的差異
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff --cached readme.txt

我們可以看到此時,工作區、暫存區與本地版本庫中的readme.txt文件狀態無差異。

4)開始回退操作,退回到V3版本

使用git reset --hard HEAD^命令,退回到前一個版本。

# 回退一個提交版本
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reset --hard HEAD^
HEAD is now at 529ad74 第3次提交,新增內容:readme.txt file v3

說明:

HEAD is now at 529ad74 第3次提交,新增內容:readme.txt file v3

意思:HEAD現在位於commit-id爲529ad74的提交,提交說明爲:第3次提交,新增內容:readme.txt file v3

5)回退後,對比工作區、暫存區與本地庫中版本中文件的差異

# 1.比對工作區與暫存區中文件的差異
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff readme.txt

# 2.比對暫存區與本地版本庫中文件的差異
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff --cached readme.txt

# 3.比對工作區與本地版本庫中文件的差異
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git diff HEAD readme.txt

回退後,我們再次對比了工作區、暫存區與本地庫中版本中文件的差異:沒有內容差異,完全一樣。

說明:工作區、暫存區和本地庫中的內容,都回退到了之前的版本。(重要)

6)查看本地版本庫的提交日誌信息

# 1.使用git log查看歷史版本記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline
529ad74 (HEAD -> master) 第3次提交,新增內容:readme.txt file v3
1b23cae 第2次提交,新增內容:readme.txt file v2
2612adf 第1次提交,創建readme.txt文件

# 2.使用git reflog查看歷史版本記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reflog
529ad74 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
e72b30f HEAD@{1}: commit: 第4次提交,新增內容:readme.txt file v4
529ad74 (HEAD -> master) HEAD@{2}: commit: 第3次提交,新增內容:readme.txt file v3
1b23cae HEAD@{3}: commit: 第2次提交,新增內容:readme.txt file v2
2612adf HEAD@{4}: commit (initial): 第1次提交,創建readme.txt文件

從上我們可以看到:(重點)

  • 使用git log命令查看歷史版本記錄,發現已經看不到第4次提交了。
  • 使用git reflog命令查看歷史版本記錄,第四次提交這個版本仍然存在的。

7)恢復到回退前版本

上面說了,使用git reset --hard命令回退,做了三個操作:

  1. 移動HEAD指針(版本庫的回退)。
  2. 暫存區的內容回退到HEAD指針指向的版本。
  3. 工作區的內容也回退到HEAD指針指向的版本。

我們現在來查看一下工作目錄中的文件狀態。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

可以看到工作目錄中是非常乾淨的。

所以若要恢復到回退之前的版本,只能使用git reset --hard命令回退。

# 1.查看可回退的歷史版本
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reflog
529ad74 (HEAD -> master) HEAD@{0}: reset: moving to HEAD^
e72b30f HEAD@{1}: commit: 第4次提交,新增內容:readme.txt file v4
529ad74 (HEAD -> master) HEAD@{2}: commit: 第3次提交,新增內容:readme.txt file v3
1b23cae HEAD@{3}: commit: 第2次提交,新增內容:readme.txt file v2
2612adf HEAD@{4}: commit (initial): 第1次提交,創建readme.txt文件

# 2.回退到第四次提交
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reset --hard e72b30f
HEAD is now at e72b30f 第4次提交,新增內容:readme.txt file v4

# 3.查看工作目錄中文件狀態
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git status
On branch master
nothing to commit, working tree clean

# 4.查看版本歷史
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git log --oneline
e72b30f (HEAD -> master) 第4次提交,新增內容:readme.txt file v4
529ad74 第3次提交,新增內容:readme.txt file v3
1b23cae 第2次提交,新增內容:readme.txt file v2
2612adf 第1次提交,創建readme.txt文件

# 5.查看可回退的歷史版本
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ git reflog
e72b30f (HEAD -> master) HEAD@{0}: reset: moving to e72b30f
529ad74 HEAD@{1}: reset: moving to HEAD^
e72b30f (HEAD -> master) HEAD@{2}: commit: 第4次提交,新增內容:readme.txt file v4
529ad74 HEAD@{3}: commit: 第3次提交,新增內容:readme.txt file v3
1b23cae HEAD@{4}: commit: 第2次提交,新增內容:readme.txt file v2
2612adf HEAD@{5}: commit (initial): 第1次提交,創建readme.txt文件

# 6.查看readme.txt內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/learngit (master)
$ cat readme.txt
readme.txt file v1
readme.txt file v2
readme.txt file v3
readme.txt file v4

我們查看到,readme.txt文件的內容已經完全恢復。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章