【问题标题】:Undo git rm -r f (ambiguous argument 'HEAD') before first commit在第一次提交之前撤消 git rm -r f(不明确的参数 'HEAD')
【发布时间】:2014-04-10 23:36:31
【问题描述】:

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

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

git reset --hard HEAD

但是得到了这个:

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 那么,就是这样吗?我被搞砸了。
    • 简短回答:是的。这应该教会您制作备份副本的重要性。如果您真的需要这些数据,可能可以使用 Photorec 等数据雕刻工具。
    【解决方案2】:

    实际上,您可以挽救文件。

    原因是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 added 的文件,然后替换为您git added 在git commiting 之前的旧文件“顶部”的新的不同内容。它还将找到任何“被放弃”的提交,包括丢弃的 git stash。 (提交进入.git/lost-found/commit/。)

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

    【讨论】:

      猜你喜欢
      • 2020-11-16
      • 2013-07-20
      • 1970-01-01
      • 2015-08-05
      • 2012-03-27
      • 2010-09-25
      相关资源
      最近更新 更多