我可以恢复已删除的文件(撤消`git clean -fdx`)吗?


119

我正在按照制作github页面的说明进行操作,却忘记向下移动到我的git子目录中。结果,我只是使用来替换整个文档目录git clean -fdx
有什么办法可以消除这个可怕的错误?


2
我不确定,但我认为使用git不可能。但是,对文件系统使用未删除的实用程序可能会成功。
static_rtti 2011年

9
有趣的是,《Git社区手册》还建议在git clean -fdx没有任何警告的情况下进行操作如此危险。我想知道有多少人用这个看似无辜的建议不可挽回地销毁了他们的文件。
僵尸化'16

5
确保检查您的IDE是否像Eclipse或IntelliJ IDE一样具有“本地历史记录”。这样可以为无意git clean通话省去很多麻烦。另外,请尝试摆脱未经检查的清洁习惯。创建一个可以被调用的Powershell或Bash脚本,该脚本将git clean -fdxn在您实际运行令人难以置信的破坏性清理之前以确认提示运行。
Josh Burgess

Answers:


129

否。这些文件不见了。

(仅在Linux上检查过:git clean调用unlink(),并且不预先备份任何内容。)


32
如果您使用的是RubyMine,Eclipse等高级IDE,则很有可能它具有删除文件的本地历史记录,您也许可以恢复它们。
乌斯曼2015年

1
在我的情况下,@ Usman git clean意外删除了.idea隐藏文件夹中的搁置更改,而“本地历史记录”救了我!
emkman'3

2
@Usman的好建议。使用Eclipse,我可以使用“从本地历史记录中恢复...”选项取回
brandizzi

1
实际上,这是可能的,但采用了骇人听闻的方法。看到这个答案:stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/...
只是影子

4
在PyCharm中,您也可以还原它们。右键单击包含它们的文件夹,在“本地历史记录”中单击,找到删除内容,然后单击“还原”。
Juanjo Conti

48
git clean -fdxn

将进行试运行,并向您显示如果运行将删除哪些文件

git clean -fdx

(当然,这只有在您提前知道但下次才知道的情况下才有用)


7
-n除此之外,它适用于大多数git命令(以及许多其他* nix命令)。
Nick McCurdy


18

否。“ git clean -fdx”将从您的工作目录中删除所有git不跟踪的文件和目录。因为Git不会跟踪这些文件,所以它不会有这些文件的任何备份。至少不是通常。

如果您最近在这些文件之一上执行了“ git add”操作(但中止了提交),则可以使用“ git fsck --lost-found”找到它。值得一试,但不要将希望寄予太大希望。

将来,您应该考虑犯几次而不是很少几次。这样,即使您最终没有将这些提交推送到远程,也将至少具有本地备份。


真正的问题是该目录也不应该是存储库。回头看一下日志,原来我忘了mkdir-ing 后进入新的repo目录cd
Eric

1
阅读此问题后不久,我为Git编写了一个补丁,其中添加了一个配置变量来备份每个删除的文件。也许对其他人有用吗?github.com/kusma/git/tree/work/clean-backup
kusma 2013年

1
我今天很幸运!!!感谢“ git fsck --lost-found”。我使用以下命令获取所有更改:git fsck | awk'{print $ 3}'| xargs git显示| tee searchresults.log当我想要添加并删除的整个文件时,可以从日志中获取它。:)
Marcello de Sales

11

正如上面提到的@kusma一样,如果您很幸运(如果您曾经做过“ git add”),则可以使用以下内容提取整个对象:

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

这样,它将查找所有类型的块,收集整个差异并添加到文件中,以提取丢失的文件。就我而言,我失去了整个Java类。


8

如果您正在使用任何Jetbrains IDE,则可以选择查看文件的本地历史记录。如果您已完成操作git clean,则可以重新创建文件并检查文件的本地历史记录,然后从那里还原它。

为我工作了一个文件。对于完整的目录,我不知道该怎么做。


在具有相同文件名的相同位置创建文件。在IDE中,右键单击并单击“显示历史记录”。复制粘贴其中的内容。极好的建议@Rajesh。谢谢。

1
我救了 谢谢。
斯科特

无需复制文件内容,只需右键单击文件,然后单击“还原”即可将其还原到该版本(即使您删除了该文件)
n00b

7

我今天有这个问题。

正如其他人所说,git不会保留文件。

取消此操作的唯一方法是使用撤消删除实用程序。我使用“ extundelete”并恢复了所有内容,但您的里程/文件系统可能有所不同。


7

如果您正在使用Eclipse,则可能的解决方案之一是从Eclipse的本地历史记录中恢复。


2
即时通讯使用PyCharm,当地历史救了我
psychok7 2015年

1
IntelliJ IDEA中也是一样!
arthurakay

RubyMine也有本地历史。救了我!
乌斯曼2015年

所有IntelliJ浏览器都有本地历史记录。谢天谢地。我当时正在使用WebStorm,在发现之前几乎有动脉瘤。3天的工作时间(相当于12小时)已经消失了,我认真考虑过要在办公桌前倒一瓶烈性酒。
Josh Burgess

7

其实!这个有可能!但不使用git命令。
我们所需要的只是一个文件恢复工具,例如Recuva
只需提及删除它的路径,然后让它恢复文件即可。

另外,以下是使用该应用程序的一些有用说明:

  1. 我强烈建议您在还原文件之前选中此复选框(当已删除的文件出现在恢复窗口中时):
    Advanced Mode-> Options-> Actions-> Restore folder structure
    这样,通过保留文件夹结构可以恢复所有文件,这样会容易得多只需将该文件夹拖放到删除位置即可。
  2. 最好在USB设备上安装恢复工具(由于以下警告)
  3. 在提及恢复文件的位置时,请避免选择与删除文件的位置相同的驱动器(再次由于以下提到的警告),因为当前恢复的文件可能会覆盖尚未恢复的其他已删除文件。将文件恢复到任何USB驱动器始终是一个不错的解决方案。

警告!一旦丢失(意外删除)任何文件,请尝试不要触摸(添加/编辑文件)已删除文件所在的驱动器,以增加成功恢复的可能性。否则,您可能会完全丢失该文件。

工作原理: 删除文件时,实际上并没有删除它。它只是标记为“已删除”,因此,下次将文件添加/更新到同一驱动器时,那些旧文件将被新文件覆盖。但是,直到它们被覆盖,仍然可以读取(当然可以恢复)文件。


1
谢谢你救了我的命。我不知道它是否是正确的答案,因为我无法恢复所有内容,但是我很幸运,因为我得到了所需的最关键的文件。
XzaR

2

我使用了应该添加到存储库中的代码,并使用-dfx进行了清理,可以还原文件。

我尝试使用debugfs,从出现的inode,testdisk和许多其他工具中进行查找和链接,但没有一个人找到这个愚蠢的内容被误删除的目录。

从sourceforge 下载extundelete
您可能需要安装e2fslibs-dev软件包
Run

$ ./configure 
$ make 

它将为src文件夹内的extundelete生成二进制文件。就我而言,我错误地擦除了一个文件夹。我们称之为FOOBAR

我跑了:

$  sudo ./extundelete --restore-directory <full path to FOOBAR > <the partition> 


它创建了一个名为RESTORED_FOLDERS的文件夹


哇!尽管此操作无法恢复我想要的文件,但我会记下它-一定会派上用场!
vyom


1

如果您使用的是Mac,并使用进行了备份Time Machine,则可以还原


0

幸运的是,我在使用Windows 7时犯了这个错误。去了回收站,突出显示了所有已删除的文件,然后单击“还原”。做完了


5
你什么意思?git clean不会将文件移动到回收站。
MEMark

0

如果您还没有推送更改(git push),您还可以从服务器中取回尚未更新的信息。我使用filezilla取回删除的文件,并将其复制到本地文件中。这不是最好的方法,但是它可以工作并且避免使用控制台

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.