在第一次提交之前撤消git rm -r f(模糊参数'HEAD')

时间:2014-03-07 17:20:34

标签: git git-reset git-rm git-fsck

在我提交之前,我在一个新的仓库中的ENTIRE目录上做了git rm -r -f。我没有分支。

我在Stack Overflow上尝试了答案,但都没有帮助。我试过这个:

git reset --hard HEAD

但得到了这个:

fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.

我有什么方法可以取回文件吗?

2 个答案:

答案 0 :(得分:3)

实际上,可以打捞文件。

原因是git rm -r只会删除索引中的文件,因此要删除它们,您必须已经git add - 编辑这些文件。当你这样做时,git使用blob-contents的SHA-1“真实名称”将每个文件的内容副本放入存储库。

如果您现在运行git fsck --lost-found,git将找到没有引用的对象(也就是说,存储库中的所有对象)并打印dangling <type> <SHA-1>。对于每个“blob”(在这种情况下,它找到的所有内容),它将内容写入SHA-1名称下的.git/lost-found/other/

$ git rm -r -f .
rm 'bar'
$ git fsck --lost-found
notice: HEAD points to an unborn branch (master)
Checking object directories: 100% (256/256), done.
notice: No default references
dangling blob f53433f357a56ddb698196519f30eb390ae684cb
$ cat .git/lost-found/other/f53433f357a56ddb698196519f30eb390ae684cb 
this is file bar
$

这也适用于有一些提交的存储库,并且是“恢复以前有引用但不再存在的东西”的一般方法。这将找到您git add编辑的文件,然后替换为您在git add之前git commit编辑“旧”的新内容。它还会发现任何“被遗弃”的提交,包括丢弃的git stashes。 (提交进入.git/lost-found/commit/。)

在上面的示例中,文件bar在其内容中方便地声明为文件bar。在大多数实际情况下,您必须查看每个恢复的blob并猜测其原始名称。

答案 1 :(得分:0)

由于您在进行任何提交之前删除了数据,因此丢失了数据。

git reset --hard不起作用,因为您没有初始提交也要重置。因此,“模糊参数”错误,git无法确定您所引用的提交,因为没有提交。