當我們使用 git reset --hard 將當前數據恢復到之前的某個版本時,在這個提交之後的提交將會丟失。如果我們想找到丟失的提交節點,可以進行下面的操作:
- 首先,使用 git reflog 或者 git log -g 可以查看我們改變 HEAD 指針的過程。
- 在輸出的信息中,我們就可以找到那次提交的 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 狀態。
閱讀更多 一起學前端 的文章