1

在我提交之前,我在一个新的 repo 中做了git rm -r -f一个 ENTIRE 目录。我没有树枝。

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

git reset --hard HEAD

但是得到了这个:

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

有什么办法可以找回文件吗?

4

2 回答 2

3

其实你可以挽救文件。

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

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

$ 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 stash。(提交进入.git/lost-found/commit/。)

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

于 2014-03-07T17:55:16.023 回答
0

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

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

于 2014-03-07T17:35:27.170 回答