我可以撤销`git clean -fdx`吗?

问题描述:

我按照making github pages的说明操作,忘了进入我的git子目录。结果,我只是用git clean -fdx加载了一个完整的文档目录。有什么办法可以解决这个可怕的错误吗?我可以撤销`git clean -fdx`吗?

+2

我不确定,但我认为这不可能与git。然而,对于你的文件系统的一个未删除的实用程序可能会诀窍。 – 2011-06-07 15:02:01

+4

有趣的是,[Git Community Book](http://schacon.github.io/gitbook/5_creating_new_empty_branches.html)也暗示'git clean -fdx'没有任何警告操作是如此危险。我想知道有多少人用这个看似无害的建议不可挽回地摧毁了他们的档案。 – catpnosis 2016-02-09 05:15:38

+1

一定要检查您的IDE是否有像Eclipse或IntelliJ IDE那样的“本地历史记录”。这可以为无意中的'git clean'调用节省很多心痛。此外,尽量摆脱不检查清洁的习惯。创建一个可以调用的Powershell或Bash脚本,它将在您实际运行_incredibly_破坏性清理之前以确认提示运行'git clean -fdxn'。 – 2017-03-20 16:07:07

否。这些文件已经消失。

(刚才检查在Linux上:git clean calls unlink(),并且不备份任何东西事先)

+13

如果您使用的是像RubyMine,Eclipse等高级IDE,机会是它将有一个删除文件的本地历史记录,您可能可以恢复它们。 – Usman 2015-10-16 23:52:23

+1

@Usman在我的情况'git clean'意外删除了'.idea'隐藏文件夹内的搁置变化,并且本地历史保存了我! – emkman 2016-03-09 03:47:40

+0

伟大的提示由@Usman。使用Eclipse,我可以通过“从本地历史记录恢复...”选项获取我的文件:http://i.imgur.com/XWNLOk5.gifv – brandizzi 2016-06-10 13:28:49

编号“git clean -fdx”会删除git没有从工作目录跟踪的所有文件和目录。因为Git不会跟踪这些文件,所以它不会有这些文件的备份。至少通常不会。

如果你最近对这些文件中的一个做了'git add'(但中止了提交),你可以用'git fsck --lost-found'找到它。这是值得一试的,但不要让你的希望过高。

在你应该考虑,而犯了几次往往多几次太少未来。这样,即使最终没有将这些提交推送到远程,您至少也会拥有本地备份。

+0

真正的问题是目录不应该是一个存储库。回想一下日志,结果我忘了在'mkdir'之后忘记cd到新的repo目录 – Eric 2011-06-07 15:07:58

+1

在读完这个问题后不久,我给Git写了一个补丁,添加了一个配置变量来备份每个被删除的文件。也许它可能对别人有用? https://github.com/kusma/git/tree/work/clean-backup – kusma 2013-02-19 15:37:17

+0

今天我很幸运!感谢“git fsck --lost-found”。我使用以下来获得所有更改: git fsck | awk'{print $ 3}'| xargs git show | tee searchresults.log 正如我想要的那样,我已经添加,然后删除了整个文件,我可以从日志中得到它。 :) – 2013-11-09 15:53:56

我今天有这个问题。

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

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

+0

谢谢。 extundelete帮助! – dotnix 2015-02-04 19:08:46

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

git clean -fdxn 

会做dry run,并告诉你,如果你跑

git clean -fdx 

文件将被删除(当然这仅仅是有益的,如果你知道这个时间提前,但是对于接下来的时间)

+4

为了补充说明,'-n'对大多数git命令(以及许多其他* nix命令)都有效。 – 2013-11-09 20:57:47

正如@kusma上面提到的,如果你是幸运的(如果你没有“混帐添加”),那么你可以使用下面的提取整个对象:

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

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

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

+2

即时通讯使用PyCharm和本地历史救了我 – psychok7 2015-01-12 16:52:49

+0

@ psychok7:很高兴知道,它为你工作! – Abhinav 2015-01-12 16:53:58

+1

IntelliJ IDEA中的一样东西! – arthurakay 2015-05-28 19:45:00

幸运的是,我犯了这个错误,而使用Windows 7又到回收站,强调所有被删除的文件,并点击“恢复”。完成。

的IntelliJ/Android的Studio允许restoring files from local history

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

另外这里是使用该应用的一些有用的注意事项:

  1. 我强烈建议你恢复 文件(当删除的文件出现在恢复窗口)之前检查此复选框:
    Advanced Mode - >Options - >Actions - >Restore folder structure
    有了这一切您的文件将通过保持夹 结构,那么它会更容易,只需将从那里被删除丢弃 文件夹路径被恢复。
  2. 安装USB设备上的恢复工具,是非常理想
  3. 在谈到恢复到的文件,避免选择从哪里文件相同的驱动器(因为下面的警告),因为如下─的地方删除(再次上述警告),因为当前恢复的文件可能会覆盖尚未恢复的其他已删除文件。将文件恢复到任何USB驱动器始终是一个很好的解决方案。

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

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

+0

谢谢你救了我的命。我不知道它是否是正确的答案,因为我无法恢复一切,但我很幸运,因为我得到了我需要的最重要的文件。 – XzaR 2017-11-09 14:27:30

+0

--- Downvoter你能否提一下downvoting的原因? – 2018-02-18 09:11:11

+0

Recuva实际上为我工作 – Emmanuel 2018-03-06 06:27:52