我能否恢复已删除的文件(撤销`git clean -fdx`)?

181

我在按照制作GitHub Pages的说明操作时,忘记进入我的git子目录。结果,我使用了git clean -fdx命令,把整个文档目录都清空了。
有没有办法撤销这个可怕的错误?


2
我不确定,但我认为使用git不可能实现。然而,您的文件系统中的恢复工具可能会有所帮助。 - static_rtti
16
有趣的是,Git Community Book也建议使用 git clean -fdx 命令,但并没有警告这个操作有多么危险。我想知道有多少人因为这个看起来无害的建议而不可挽回地删除了他们的文件。 - catpnosis
8
请确保你的IDE是否有“本地历史记录”功能,就像Eclipse或IntelliJ IDE一样。这可以避免意外调用git clean而引起的许多麻烦。此外,请尝试不要养成在不检查的情况下清理项目的习惯。创建一个Powershell或Bash脚本,可以调用该脚本并在运行非常具有破坏性的清理操作之前运行git clean -fdxn,并提供确认提示。 - Josh Burgess
18个回答

170

不行了,那些文件已经被删除了。

(在Linux上进行了检查:git clean 调用 unlink(),并且没有提前备份任何东西。)


54
如果您正在使用像RubyMine、Eclipse等高级IDE,很有可能它们会记录已删除文件的本地历史记录,并且您可能能够恢复它们。 - Usman
1
在我的情况下,git clean 不小心删除了 .idea 隐藏文件夹中的搁置更改,而本地历史记录则拯救了我! - emkman
5
@Usman的一个好建议。在Eclipse中,我可以使用“从本地历史记录还原...”选项找回我的文件: http://i.imgur.com/XWNLOk5.gifv - brandizzi
1
实际上这是可能的,但需要使用hacky方法。请参考此答案:https://dev59.com/F2025IYBdhLWcg3wAhDp#42861993 - Just Shadow
11
在PyCharm中,您也可以恢复它们。右键单击包含这些文件的文件夹,点击“本地历史记录”,找到被删除的文件并点击还原。 - Juanjo Conti
显示剩余4条评论

70
git clean -nfdx

将进行测试运行,并向您展示如果运行此操作将删除哪些文件

git clean -fdx

当然,这只有在事先知道的情况下才有帮助,但下次可以用上。

9
此外,-n 在大多数 Git 命令(以及许多其他 *nix 命令)中有效。 - Nick McCurdy

58

9
PyCharm也支持这个功能!谢谢你的回答。我很高兴在前三个回答是“抱歉,你没有运气”的情况下,我还读了其他的答案。 - Bryson
6
JetBrains(以及你)拯救了我的一天! - ruohola
1
VSCode也会自动保存。我的工作得救了!https://dev59.com/_rvoa4cB1Zd3GeqP2mKf#71657994 - Jakob Lindskog

32

VS Code 还保留了历史记录,您可以从中恢复。

执行“本地历史记录:查找要恢复的条目”(可使用 cmd+shift+p 并搜索“恢复”)

输入您的文件名并选择您想要的版本。


你是位绅士和学者,非常感谢您。 - rayaqin
4
误操作了一个错误的命令,而你刚刚节约了我太多时间。 - ArranJacques
你是真正的英雄 - undefined

25

“git clean -fdx”会从你的工作目录中删除所有Git未跟踪的文件和目录。由于Git不跟踪这些文件,因此它没有这些文件的任何备份。至少通常情况下没有。

如果您最近对其中一个文件执行了“git add”(但取消了提交),则可以尝试使用“git fsck --lost-found”找到它。值得一试,但不要抱太大希望。

在将来,您应考虑经常进行提交,而不是过少次数的提交。这样,即使您不将这些提交推送到远程,您至少有本地备份。


真正的问题是该目录本不应该是一个仓库。回顾日志,事实证明在 mkdir 创建新仓库后,我忘记切换到新仓库目录(使用 cd 命令)。 - Eric
2
在阅读了这个问题后不久,我为Git编写了一个补丁,添加了一个配置变量来备份每个已删除的文件。也许对其他人有用呢?https://github.com/kusma/git/tree/work/clean-backup - kusma
3
今天真幸运!!!多亏了“git fsck --lost-found”。我使用以下命令获取所有更改:git fsck | awk '{print $3}' | xargs git show | tee searchresults.log由于我想获得我添加并删除的整个文件,所以我可以从日志中获取它。 :) - Marcello DeSales

22
如果您使用Jetbrains IDE,那么有一种选项可以查看文件的本地历史记录。如果您执行了git clean操作,则可以重新创建该文件并检查该文件的本地历史记录,并从中恢复该文件。
对于单个文件,这对我很有效。但是对于完整目录,我不知道如何做到这一点。

2
在相同的位置创建具有相同文件名的文件。在IDE中右键单击并单击“显示历史记录”。从中复制粘贴内容。 @Rajesh提供了很好的建议。谢谢。 - deep
1
我已经保存了。谢谢。 - Scott
不需要复制文件内容,只需右键单击文件,然后单击“还原”即可将其恢复到该版本(即使您已将其删除)。 - n00b
这应该是最好的答案! - Lolo.
答案中的那个应该是最佳答案。帮了我大忙。 - Emjey

17

正如@kusma上面提到的,如果你很幸运(如果你曾经执行过"git add"),那么你可以使用以下命令来提取整个对象:

git fsck | awk '{print $3}' | xargs git show | tee searchresults.log

这样,它将寻找所有类型的块,收集整个差异并添加到一个文件中,您可以从中提取丢失的文件。在我的情况下,我丢失了一个完整的Java类。


16

实际上是的!这是可能的!但是不需要使用git命令。
我们所需要的只是像Recuva这样的文件恢复工具。
只需提及被删除的路径,让它恢复文件即可。

此外,以下是使用该应用程序的一些有用注意事项:

  1. 在还原文件之前,请务必勾选此复选框(当已删除的文件出现在恢复窗口中时):
    高级模式->选项->操作->还原文件夹结构
    这样,所有文件都将通过保持文件夹结构来恢复,因此您可以更轻松地将该文件夹拖放到被删除的路径。
  2. 最好将恢复工具安装在USB设备上(因为下面的警告)
  3. 在提及要在何处恢复文件时,避免选择与已删除文件所在驱动器相同的驱动器(再次由于下面提到的警告),因为当前恢复的文件可能会覆盖尚未恢复的其他已删除文件。将文件恢复到任何USB驱动器总是一个不错的解决方案。

警告!一旦您丢失(意外删除)文件,请尽量避免触摸(添加/编辑文件)从中删除文件的驱动器,以增加成功恢复的可能性。否则,您可能会完全丢失该文件。


为什么会有效?
当您删除文件时,实际上它并没有真正被删除。它只是标记为“已删除”,因此下次您添加/更新文件到同一驱动器时,旧文件将被新文件覆盖。但在它们被覆盖之前,仍然可以读取(当然也可以恢复)这些文件。


1
谢谢你救了我的命。我不知道是否是正确的答案,因为我无法恢复所有东西,但我很幸运,因为我得到了我需要的大部分关键文件。 - XzaR

14
如果您使用的是IntelliJ IDEA或Android Studio,这可以很容易地完成。只需创建与您删除的文件名称相同的文件,并单击VCS -> 本地历史记录 -> 显示历史记录。不幸的是,它不适用于像JPEG或PNG图像这样的媒体文件。此外,目前只能逐个恢复已删除的文件。但是,这个选项已经在关键时刻救了我很多次,所以感激有这个功能。

2
这个救了我!谢谢!! - user1015214

10

今天我遇到了这个问题。

就像其他人说的那样,git不会保留文件。

唯一撤销此操作的方法是使用未删除实用程序。 我使用了“extundelete”并找回了所有内容,但您的情况/文件系统可能有所不同。


沿着这条线,ext4magic也非常有帮助。 - Sagar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接