Git中的數據恢復

Git中的數據恢復

當我們使用 git reset --hard 將當前數據恢復到之前的某個版本時,在這個提交之後的提交將會丟失。如果我們想找到丟失的提交節點,可以進行下面的操作:

  1. 首先,使用 git reflog 或者 git log -g 可以查看我們改變 HEAD 指針的過程。
  2. 在輸出的信息中,我們就可以找到那次提交的 HASH 值,以此就可以恢復到那個提交節點。

實際上,Git 會將我們操作 HEAD 的過程記錄下來,放在 .git/logs 目錄下。git reflog 就是顯示這些引用更改的日誌。

實際操作

初始化倉庫,並建立四次提交。

$ echo 'version 1' > test.txt

$ git add . && git commit -m "first commit"

$ echo 'version 2' > test.txt

$ git add . && git commit -m "second commit"

$ echo 'version 3' > test.txt

$ git add . && git commit -m "third commit"

$ echo 'version 4' > test.txt

$ git add . && git commit -m "forth commit"

然後恢復到第二次提交:

$ git reset --hard HEAD^^

查看提交歷史:

$ git log

commit 4b2291bffa6543ecfc972e876a8c75752c8400f5 (HEAD -> master)

Author: Vactor <[email protected]>

Date: Mon Jul 16 00:43:05 2018 +0800

second commit

commit 5522d5148d6de7d161bf6ac372e77598192d5284

Author: Vactor <[email protected]>

Date: Mon Jul 16 00:42:45 2018 +0800

first commit

找不到第三次和第四次提交了! 怎麼辦?

使用 git reflog :

$ git reflog

4b2291b (HEAD -> master) HEAD@{0}: reset: moving to HEAD^^

24d3559 HEAD@{1}: commit: forth commit

ef8d434 HEAD@{2}: commit: third commit

4b2291b (HEAD -> master) HEAD@{3}: commit: second

或者 git log -g :

$ git log -g

commit 4b2291bffa6543ecfc972e876a8c75752c8400f5 (HEAD -> master)

Reflog: HEAD@{0} (Vactor <[email protected]>)

Reflog message: reset: moving to HEAD^^

Author: Vactor <[email protected]>

Date: Mon Jul 16 00:43:05 2018 +0800

second commit

commit 24d355980596e45fd8288e5d80e2b5fee56ad1a0

Reflog: HEAD@{1} (Vactor <[email protected]>)

Reflog message: commit: forth commit

Author: Vactor <[email protected]>

Date: Mon Jul 16 00:43:40 2018 +0800

forth commit

commit ef8d43472e087ed9204808ebfec5da88528fd35e

Reflog: HEAD@{2} (Vactor <vac872089248>)/<vac872089248>

Reflog message: commit: third commit

Author: Vactor <[email protected]>

Date: Mon Jul 16 00:43:24 2018 +0800

third commit

找到了所有丟失的信息,就可以恢復了。創建一個新的分支,指向第三次提交!

$ git branch recover-branch ef8d434

引用日誌也沒了怎麼辦?

如果將引用日誌也刪除了,那該怎麼辦呢?可以使用下面的命令,找到所有沒有被其他對象引用的對象,也就是那些遊離的對象。

我們將 .git/logs 刪除,然後執行命令:

$ git fsck --full

Checking object directories: 100% (256/256), done.

dangling commit 24d355980596e45fd8288e5d80e2b5fee56ad1a0

就會發現第四次提交處於 dangling 狀態。因為第四次提交的父節點是第三次提交,所以第三次提交併不是 dangling 狀態。


分享到:


相關文章: