我gm rm -rf一个文件夹,提交,然后推送。我该如何解决?

时间:2016-01-29 23:32:24

标签: git github

我尝试在使用git rm进行初始提交之前从git中删除文件,但它没有用,因为它是一个文件夹,因此我使用了git rm -rf <file>
不幸的是,这使我没有该文件的提交历史记录,并且它似乎也已在本地删除。我去了垃圾桶,它也不在那里。这老实说让我害怕git而且我不知道如何修复它。我可以在没有它的情况下生活,但它是我制作的网站的所有源文件,这让我的生活变得艰难。反正有没有从dist文件夹中恢复/生成一个src文件夹,虽然我非常怀疑?

3 个答案:

答案 0 :(得分:1)

您的问题

如果我理解正确,你就像这样添加了你的文件:

git add my_dir/*

在提交之前,你删除了所有内容:

git rm -fr my_dir
之后一切都消失了。

您的解决方案

要解决此问题,请按照下面的Ikke建议进行操作:

git fsck --lost-found

寻找关于&#34;悬挂blob&#34; (你希望丢失的文件),就像这个:

dangling blob 3a9b15a451d1e77aa262f3379dfb20d235b6f9d4

这些悬空blob将不会提供有关丢失文件名称的任何信息,但是应该保留其内容。

调查每个blob并恢复内容,如下所示:

git show 3a9b15a451d1e77aa262f3379dfb20d235b6f9d4 > my_dir/original_file

参考

另见亚历山大·格拉迪什的答案:In Git, how can I recover a staged file that was reverted prior to committing?和Vi的答案。在这里:Recover dangling blobs in git

答案 1 :(得分:0)

要恢复该文件夹,您需要找到仍然拥有它的最后一次提交。

让我们想象它是最后一次提交。然后,您可以使用以下命令恢复该文件夹:

git checkout HEAD~1 <folder>

HEAD~1是对倒数第二次提交的引用。如果它是更旧的提交,您可以增加数量。

执行此命令将从该提交中获取该文件夹的内容并将其放入您的工作树中。

编辑:

你说你甚至从未编过那个文件?然后在git中确实没有它的历史,因为你从未要求git保留任何历史。

你有没有在该文件夹上执行git add?然后,文件仍然存储在git中,但是将它们恢复到文件中并不容易。

您可以使用git fsck --lost-found来搜索未引用对象的对象存储,并将它们存储在.git / lost-found中。

对于blob,它们将存储在.git / lost-found / other中。检查那些文件,看看你是否找到了你丢失的文件。

答案 2 :(得分:-1)

首先,请注意:,它不仅记录提交,而且记录git不再可见的状态。几乎任何git实际知道的东西都会在那里。如果你有疑问,请检查一下。

其次,备份当前目录。用git复制整个目录。 Git可能已经退缩了,所以一旦你习惯了git,这很少是必要的,但作为一个新手,它让你有信心做任何你需要的“破解”工作副本而不用担心让事情变得更糟。 / p>

好的,所以你可以备份你创建的任何破碎或未破坏的状态,现在你可以放心地处理副本,找出你做了什么。 git reflog然后git reflog,看看它是否是您想要和需要的。获取所需的提交和未提交的文件,然后提交未跟踪的内容,直到您满意为止。

现在,最后,你必须考虑你所做的推动是否公开。如果它是公开的,并且任何人都可能已经或将来撤销该提交,您将git branch sOmEhAsH并撤消您的错误。如果没有其他人可能收到错误提交,你可以做!破坏性的!强制推送的动作,通过破坏性 git revert sOmEhAsH,无论在远程分支中需要覆盖什么,都会推高当前分支中的所有内容。小心使用它通常不建议在任何共享分支上使用。