【學了就忘】Git操作 — 49.Git中數據恢復

在你使用Git的時候,你可能會意外丟失一次提交。通常這是因爲你強制刪除了正在工作的分支,但是最後卻發現你還需要這個分支;亦或者硬重置了一個分支,放棄了你想要的提交。

如果這些事情已經發生,該如何找回你的提交呢?

看下面示例:

1、說明版本庫情況

版本庫此時情況如下:

# 1.查看版本庫歷史提交記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git log --oneline
83e08e5 (HEAD -> master) 第6次提交,新增 v6版本
e2afef2 第5次提交,新增 v5版本
2e221cc 第2次提交,新增 v2版本
358c5de 第1次提交,新增readme.txt文件 v1版本

# 2.查看readme.txt文件內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ cat readme.txt
Retrieve commit v1
Retrieve commit v2
Retrieve commit v5
Retrieve commit v6

# 3.查看可回退的歷史提交記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git reflog
83e08e5 (HEAD -> master) HEAD@{0}: commit: 第6次提交,新增 v6版本
e2afef2 HEAD@{1}: commit: 第5次提交,新增 v5版本
2e221cc HEAD@{2}: reset: moving to 2e221cc
c379ed8 HEAD@{3}: commit: 第4次提交,新增 v4版本
cb82083 HEAD@{4}: commit: 第3次提交,新增 v3版本
2e221cc HEAD@{5}: commit: 第2次提交,新增 v2版本
358c5de HEAD@{6}: commit (initial): 第1次提交,新增readme.txt文件 v1版本

我們從上可以查看,readme.txt文件,是有v1-v4版本,之後回退了兩個版本,然後又提交了兩個版本v5v6,纔有了現在的情況。

現在版本庫中的情況如下圖:

需求:現在我需要被丟棄提交中的內容。

2、恢復提交中的內容

從上圖中我們可以看到,commit-3commit-4這兩個提交已經丟失了,沒有分支指向這兩個提交。

如果要恢復這兩個提交中的內容,我們需要找到commit-4提交的SHA-1,然後增加一個指向它的分支。

(如果只需要恢復commit-3中的內容,就再commit-3上創建分支。)

(1)找到commit-4提交的SHA-1

最方便也是最常用的方法,是使用git reflog命令查看。

當你正在工作時,Git會默默地記錄每一次HEAD指針的改變。也就是每一次提交或改變分支,引用日誌都會被更新。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git reflog
83e08e5 (HEAD -> master) HEAD@{0}: commit: 第6次提交,新增 v6版本
e2afef2 HEAD@{1}: commit: 第5次提交,新增 v5版本
2e221cc HEAD@{2}: reset: moving to 2e221cc
c379ed8 HEAD@{3}: commit: 第4次提交,新增 v4版本
cb82083 HEAD@{4}: commit: 第3次提交,新增 v3版本
2e221cc HEAD@{5}: commit: 第2次提交,新增 v2版本
358c5de HEAD@{6}: commit (initial): 第1次提交,新增readme.txt文件 v1版本

(2)在commit-4提交節點上創建要給分支

你可以通過創建一個新的分支指向這個提交,來恢復該提交。

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git branch recover-branch c379ed8

(3)切換到recover-branch分支查看

# 1.切換到recover-branch分支
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git status
On branch master
nothing to commit, working tree clean

L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git checkout recover-branch
Switched to branch 'recover-branch'

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

# 2.查看recover-branch分支歷史版本記錄。
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (recover-branch)
$ git log --oneline
c379ed8 (HEAD -> recover-branch) 第4次提交,新增 v4版本
cb82083 第3次提交,新增 v3版本
2e221cc 第2次提交,新增 v2版本
358c5de 第1次提交,新增readme.txt文件 v1版本

# 3.查看readme.txt文件內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (recover-branch)
$ cat readme.txt
Retrieve commit v1
Retrieve commit v2
Retrieve commit v3
Retrieve commit v4

我們可以看到,現在有一個名爲recover-branch的分支,指向了master分支曾經指向的地方。這樣commit-3commit-4這兩個提交,就再一次被分支指向了。

(4)合併recover-branch的分支的內容到master分支上

# 1.切換到master
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (recover-branch)
$ git checkout master
Switched to branch 'master'

# 2.把recover-branch分支合併到master分支上
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git merge recover-branch
Auto-merging readme.txt
CONFLICT (content): Merge conflict in readme.txt
Automatic merge failed; fix conflicts and then commit the result.

# 3.解決衝突
# 3.1 查看工作目錄中文件狀態
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master|MERGING)
$ git status
On branch master
You have unmerged paths.
  (fix conflicts and run "git commit")
  (use "git merge --abort" to abort the merge)

Unmerged paths:
  (use "git add <file>..." to mark resolution)
        both modified:   readme.txt

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

# 3.2 對readme.txt文件內容的衝突進行解決
# 初始內容如下:
Retrieve commit v1
Retrieve commit v2
<<<<<<< HEAD
Retrieve commit v5
Retrieve commit v6
=======
Retrieve commit v3
Retrieve commit v4
>>>>>>> recover-branch

# 修改過後的內容如下:
Retrieve commit v1
Retrieve commit v2
Retrieve commit v3
Retrieve commit v4
Retrieve commit v5
Retrieve commit v6

# 3.3 把修改過後的readme.txt文件添加到暫存區
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master|MERGING)
$ git add readme.txt

# 3.4 此時再查看工作目錄中文件狀態,可以看到readme.txt文件衝突已解決
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master|MERGING)
$ git status
On branch master
All conflicts fixed but you are still merging.
  (use "git commit" to conclude merge)

Changes to be committed:
        modified:   readme.txt


# 4.提交,完成分支合併
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master|MERGING)
$ git commit -m "恢復 v3 v4 版本代碼"
[master acbb2a1] 恢復 v3 v4 版本代碼

# 5.查看readme.txt文件內容
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ cat readme.txt
Retrieve commit v1
Retrieve commit v2
Retrieve commit v3
Retrieve commit v4
Retrieve commit v5
Retrieve commit v6

# 6.查看版本庫中歷史提交記錄
L@DESKTOP-T2AI2SU MINGW64 /j/git-repository/commit_test (master)
$ git log --oneline
acbb2a1 (HEAD -> master) 恢復 v3 v4 版本代碼
83e08e5 第6次提交,新增 v6版本
e2afef2 第5次提交,新增 v5版本
c379ed8 (recover-branch) 第4次提交,新增 v4版本
cb82083 第3次提交,新增 v3版本
2e221cc 第2次提交,新增 v2版本
358c5de 第1次提交,新增readme.txt文件 v1版本

可以看到commit-3commit-4這兩個提交已經恢復。之後就可以把recover-branch刪除掉了。

以上步驟圖解如下:

演示完畢。

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