发布后,所有暂存但未提交的文件都被删除:git reset --hard HEAD

时间:2012-07-23 22:23:15

标签: git filesystems

通常情况下,你可以这样做:

$ 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命令之前(或何时)的条件?

3 个答案:

答案 0 :(得分: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

为所有人做这件事,然后让他们回来。

答案 1 :(得分: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

答案 2 :(得分:0)

我非常喜欢从answer到相关Stack Overflow问题的以下解决方案:

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

相关问题