【问题标题】:Can I restore deleted files (undo a `git clean -fdx`)?我可以恢复已删除的文件(撤消 `git clean -fdx`)吗?
【发布时间】:2011-09-10 03:57:06
【问题描述】:

我按照making github pages 上的说明进行操作,却忘记向下移动到我的 git 子目录。结果,我只是用git clean -fdx 核对了整个文档目录。
有什么办法可以弥补这个可怕的错误?

【问题讨论】:

  • 我不确定,但我认为 git 不可能。但是,您的文件系统的取消删除实用程序可能会解决问题。
  • 有趣的是,Git Community Book 还建议git clean -fdx 没有任何警告说操作是如此危险。我不知道有多少人因为这个看似无辜的建议而无法挽回地销毁了他们的文件。
  • 请务必检查您的 IDE 是否像 Eclipse 或 IntelliJ IDE 那样具有“本地历史记录”。这可以为您避免因无意的git clean 来电而心痛。另外,尽量改掉不检查就打扫的习惯。创建一个可以调用的 Powershell 或 Bash 脚本,在您实际运行 令人难以置信的 破坏性清理之前,它将运行 git clean -fdxn 并带有确认提示。

标签: git git-clean


【解决方案1】:

没有。那些文件不见了。

(刚刚在 Linux 上查看:git clean calls unlink(),并没有事先备份任何内容。)

【讨论】:

  • 如果您使用的是 RubyMine、Eclipse 等高级 IDE,它可能会在本地保存已删除文件的历史记录,您或许可以恢复它们。
  • @Usman 在我的情况下 git clean 不小心删除了 .idea 隐藏文件夹中搁置的更改,本地历史记录救了我!
  • @Usman 的好建议。使用 Eclipse,我可以使用“从本地历史恢复...”选项取回我的文件:i.imgur.com/XWNLOk5.gifv
  • 实际上这是可能的,但使用了 hacky 方法。看到这个答案:stackoverflow.com/questions/6267180/can-i-undo-a-git-clean-fdx/…
  • 在 PyCharm 中你也可以恢复它们。右键单击包含它们的文件夹,单击本地历史记录,找到删除并单击恢复。
【解决方案2】:
git clean -fdxn

会做一个dry run,告诉你如果你跑了哪些文件会被删除

git clean -fdx

(当然,这只有在您提前知道这一点时才有用,但下次)

【讨论】:

  • 补充一点,-n 适用于大多数 git 命令(以及许多其他 *nix 命令)。
【解决方案3】:

IntelliJ/Android Studio 允许restoring files from local history

【讨论】:

  • PyCharm 也支持这个!谢谢你的回答。我很高兴在前 3 名是“不,对不起,你不走运”之后阅读了其余的答案。
  • JetBrains(和你)拯救了我的一天!
【解决方案4】:

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

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

在未来,您应该考虑多提交几次,而不是少提交几次。这样你至少会有一个本地备份,即使你最终没有将这些提交推送到远程。

【讨论】:

  • 真正的问题是该目录也不应该是存储库。回顾日志,原来我在mkdir-ing 之后忘记 cd 到新的 repo 目录
  • 读完这个问题后不久,我给 Git 写了一个补丁,添加了一个配置变量来备份每个删除的文件。也许它对其他人有用? github.com/kusma/git/tree/work/clean-backup
  • 我今天很幸运!!!感谢“git fsck --lost-found”。我使用以下内容来获取所有更改: git fsck | awk '{打印 $3}' | xargs git 显示 | tee searchresults.log 因为我想要添加然后删除的整个文件,所以我可以从日志中获取它。 :)
【解决方案5】:

正如上面提到的@kusma,如果你是幸运(如果你曾经做过“git add”),那么你可以使用以下方法来提取整个对象:

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

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

【讨论】:

    【解决方案6】:

    如果您使用的是任何 Jetbrains IDE,则可以选择查看文件的本地历史记录。如果您已经完成git clean,您可以重新创建文件并检查文件的本地历史记录并从那里恢复。

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

    【讨论】:

    • 在相同位置创建具有相同文件名的文件。在 IDE 中右键单击并单击“显示历史记录”。复制粘贴其中的内容。很好的建议@Rajesh。谢谢。
    • 我得救了。谢谢。
    • 无需复制文件内容,只需右键单击该文件,然后单击“还原”即可将其恢复到该版本(即使您已删除)
    • 这应该是最好的答案!
    【解决方案7】:

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

    这里还有一些关于使用该应用程序的有用说明:

    1. 我强烈建议您在恢复之前选中此复选框 文件(当被删除的文件出现在恢复窗口中时):
      Advanced Mode->Options->Actions->Restore folder structure
      有了这个,您的所有文件都将通过保留文件夹来恢复 结构,因此只需拖放它会容易得多 文件夹到它被删除的路径。
    2. 最好在 USB 设备上安装恢复工具(因为下面的警告)
    3. 在提到恢复文件的位置时,避免选择删除文件的同一驱动器(同样是因为下面提到的警告),因为目前,恢复的文件可能会覆盖另一个尚未恢复的已删除文件。将文件恢复到任何 USB 驱动器始终是一个很好的解决方案。

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


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

    【讨论】:

    • 谢谢你救了我的命。我不知道这是否是正确答案,因为我无法恢复所有内容,但我很幸运,因为我得到了我需要的最重要的文件。
    【解决方案8】:

    我今天遇到了这个问题。

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

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

    【讨论】:

      【解决方案9】:

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

      【讨论】:

      • 我正在使用 PyCharm,本地历史记录救了我
      • 在 IntelliJ IDEA 中同样的事情!
      • RubyMine 也有本地历史。救了我!
      • 所有 IntelliJ 浏览器都有本地历史记录。谢天谢地。我正在使用 WebStorm,但在我发现它之前几乎患有动脉瘤。相当于 12 小时的 3 天工作日过去了,我认真考虑过在我的办公桌上喝一瓶烈酒。
      【解决方案10】:

      如果你使用的是mac并用Time Machine备份,那么你可以恢复

      【讨论】:

      • 你救了我的命......直到我看到你的评论我才想到。
      • @WilliamRomero 经常有一些好处,很高兴提醒你。
      【解决方案11】:

      如果您使用的是 IntelliJ IDEAAndroid Studio,则可以轻松完成。只需创建与您删除的名称相同的文件,然后单击该文件的VCS -> Local History -> Show History。不幸的是,它不适用于 JPEG 或 PNG 图像等媒体文件。此外,目前您只能一个接一个地恢复已删除的文件。然而,这个选项救了我很多次,所以谢天谢地,它就在那里。

      【讨论】:

      • 这救了我!谢谢!!
      【解决方案12】:

      我使用了我应该添加到我的存储库的代码,我用 -dfx 清理了我可以恢复文件。

      我尝试使用 debugfs,从 inode、testdisk 和许多其他出现的工具中查找和链接,但没有人找到这个愚蠢的写作意外删除的目录。

      从 sourceforge 下载 extundelete
      您可能需要安装e2fslibs-dev package
      运行

      $ ./configure 
      $ make 
      

      它将在 src 文件夹中生成用于 extundelete 的二进制文件 就我而言,我错误地删除了一个文件夹。让我们称之为FOOBAR

      我刚刚跑了:

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


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

      【讨论】:

      • 哇!虽然这并没有恢复我想要的文件,但我会记下它 - 一定会派上用场!
      【解决方案13】:

      如果您在 MSBuild 中使用 git,我创建了一个复制所有文件的目标,然后执行 git clean -xdf。这样,如果您意识到您删除了不想删除的内容,您可以轻松地恢复文件。看这里:http://blog.3d-logic.com/2012/11/04/safe-git-clean-with-msbuild/

      【讨论】:

        【解决方案14】:

        没有,但也许你有备份,但你甚至都不知道。

        这取决于这些文件在您的机器上放置了多长时间。 如果这些文件超过一天,那么您的备份就有很好的更改。

        在 Linux Mint 上,您可能安装了 Timeshift 备份工具。如果你足够幸运,你的代码文件夹会包含在每日备份中。

        在 MacOS 上,您可能会遇到Time Machine

        如果您的笔记本电脑/PC 位于 company fleet 中,那么他们也有可能拥有备份。

        如果机器在cloud,很可能有备份或硬盘snapshot

        在任何情况下,事先与git clean -n 仔细检查总是一个好主意

        【讨论】:

          【解决方案15】:

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

          【讨论】:

            【解决方案16】:

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

            【讨论】:

            • 什么意思? git clean 不会将文件移动到回收站。
            猜你喜欢
            • 2016-04-17
            • 1970-01-01
            • 2020-07-09
            • 2012-07-29
            • 1970-01-01
            • 1970-01-01
            • 2015-09-17
            • 2014-06-13
            相关资源
            最近更新 更多