9

通常,您可以执行以下操作:

$ echo "Stanley, you must beware of the Drive bee" > file-a
$ echo "What's a Drive bee?" > file-b
$ git init .
$ git add file-b
$ git commit file-b -m "We don't know, but whatever error you make with it could be fatal."
$ git reset --hard HEAD
$ ls
file-a file-b

我觉得我做了一件很糟糕的事情:

$ echo "What are you doing, you darn ?" > file-a
$ echo "Can't you see I'm trying to drive?" > file-
$ git init .
$ git add -A
$ git commit file- -m "Oh, my God! [It's] the Drive !"
$ git reset --hard HEAD
$ ls
file-

结果:所有暂存但未提交的文件已删除 0_o

git reset --hard HEAD\^
fatal: ambiguous argument 'HEAD^': unknown revision or path not in the working tree.

有什么办法可以恢复我刚刚删除的文件吗?换句话说,是否可以将 git 存储库恢复到git add -A发出命令之前(或何时)的状态?

4

3 回答 3

20

是的,你真的很幸运。您添加到 Git 索引中的内容以某种方式存在。事实上,当每个文件被添加到索引中时,Git 确实已经为每个文件创建了 blob 对象。索引本身只存储树对象。

所以是的,为您的暂存文件创建了 blob 对象。您丢失的只是树信息,即路径和文件名,但您可以恢复内容。

尝试运行git fsck,你应该得到一个悬空 blob 的列表:

Checking object directories: 100% (256/256), done.
dangling blob ac28af8d84fc71eb247ccf665c6d0f4bf1822520
dangling blob 2d152ff9f09cb08ebc495f453da63eddaa9e249f
dangling blob cd9567427762cd8066b4e802e5c170a31a026100

然后,您可以通过执行来恢复内容git cat-file -p ac28af8d。例如,您可以将其通过管道传输到文件:

git cat-file -p ac28af8d > recovered-file

对他们所有人都这样做,你就会让他们回来。

于 2012-07-23T22:35:37.203 回答
2

以下脚本将所有悬空 blob 从git fsck输出恢复到文件中:

i=0; for x in `git fsck | grep "dangling blob [0-9a-f]" | cut -d ' ' -f 3`; do git cat-file -p $x > /tmp/test${i}; i=$((i+1)) ; done

如您所见,每个原始文件的输出都恢复为通用文件名 /tmp/test${i} ...我还没有找到恢复文件名的方法...我尝试过的命令是git ls-tree

首先,我采取了可能的对象:

./.git/objects/37
./.git/objects/37/5187f5882593f7e52c8efef602d98f1f049c5d
./.git/objects/37/98be05fcbd7c79e08703aead800529b362332b

然后,我试图做到这一点ls-tree,但它未能将其识别为有效对象。

/<myproj>/.git/objects/37 ]$ git ls-tree 5187f5882593f7e52c8efef602d98f1f049c5d 
fatal: Not a valid object name 5187f5882593f7e52c8efef602d98f1f049c5d
于 2016-03-06T15:10:25.077 回答
0

我真的很喜欢从这个答案到相关 Stack Overflow 问题的以下解决方案:

  1. 用于git log --diff-filter=D --summary获取所有已删除文件和已删除文件的提交
  2. 用于git checkout $commit~1 filename恢复已删除的文件。

它简洁直观。

于 2016-03-06T17:04:08.007 回答