有没有一种方法可以从意外的“svn revert”中恢复?

104

今天早上我自己给自己惹麻烦了,具体如下:

  1. 开始修改我的项目
  2. 对一些文件进行了编辑
  3. 发现我的方法不对,需要从头再来
  4. 进入项目的顶层目录并执行"svn --recursive revert ."命令,将本地沙盒还原至修改之前的状态。
  5. 惊恐地大喊:我忘记了在本地沙盒中有一些未提交的修改,现在所有这些修改都消失了。(由于上周五svn服务器崩溃了所以我不能提交修改,在周末时我也把这件事情忘记了)

幸运的是,在离开工作岗位前我曾执行过 "svn diff > temp.txt" 命令并将其保存在硬盘上,所以我可以将该文件导入 "patch" 工具中以恢复丢失的修改。

但为了以后能记住(即下次再犯同样的错误),请问是否有办法告诉svn撤销"svn revert"操作?svn是否会在任何地方备份未提交的本地修改?


36
据我所知,TortoiseSVN将被还原的文件移动到回收站,但原始的SVN命令行客户端没有这种细微差别。 - Dario Solera
5
有关回收站的顶级评论。那刚刚挽救了我的一天! - OrganicPanda
2
我的也是!非常感谢。恢复的文件刚刚出现在我的回收站中,可以恢复。 - sladda
我希望SVN有像Mercurial一样的功能,可以在还原之前自动保存每个文件的备份。 - amos
10个回答

109

有一个解决方案... 前往回收站,您会在那里找到被删除文件的最新版本。 Tortoise会将每个还原的文件“扔”进回收站。


2
顺便提一下,这也是为什么TortoiseSVN在执行还原操作时看起来如此缓慢的原因。当回收站已满时,将文件移动到回收站是一个非常缓慢的操作。您可以在“常规-对话框1”TortoiseSVN设置中禁用此功能。 - Wim Coenen
8
谢谢你,你救了我!我不小心点击了“还原”按钮,差点失去了两周的工作成果。幸运的是,我在回收站里找到了它。 - Arie Livshin
2
@ArieLivshin,为什么你在没有提交的情况下工作了两个星期?看来你需要更多地了解分支。 - JoelFan
谢谢。非常有帮助。 - Prem Singh Bist
谢谢!是的,这绝对需要设置为被接受的答案! - RohinNZ
显示剩余2条评论

89

不,(绝对)不行

如果你告诉Subversion应该还原一个文件,所有的更改都会消失。只有你的记忆能够找回它们。

例外:你新增的文件只会失去“已添加”的状态,但文件仍然保留在该目录中,只是状态变成了未知(“?”)

平台/软件例外:在Windows上使用TortoiseSVN,还原操作会首先将文件移到回收站,然后再进行还原。你可以深入回收站来恢复这些文件。


11
以上内容的补充说明:版本控制只有在您实际提交文件时才会帮助您。如果您处于这样的位置,即删除您的工作副本将丢失数小时的工作,则您提交的频率不够高。 - myron-semack
13
是的!!!根据您的操作系统和/或IDE,有一种恢复方法——在你心脏病发作之前,请阅读以下其他答案!! - Dave
2
这并不是真的,它比简单的“否”要复杂一些。使用恢复工具,或者如果你很幸运,文件可能在回收站中。 - RaphMclee
1
@RalphMclee:这取决于平台和svn客户端。TortoiseSVN会将还原的新文件保存在回收站中。这只是一个例外。我怀疑恢复工具能以一致的方式重建您文件的更改。记住:还原会破坏您的工作,使用时要小心! - Peter Parker
1
我将此标记为答案的原因是因为我不使用TortoiseSVN或Windows,所以那个解决方案对我无效。 - Jeremy Friesner
显示剩余11条评论

31

虽然不是特别针对Subversion,但如果你正在使用Eclipse,你可以尝试在本地历史记录中找到你要的信息。

现在,更加关于Subversion的内容:如果你不想为每次更改都创建一个分支,可以在本地检出几个主干(trunk-modif-1、trunk-modif-2...)。每个“修改”都在单独的树上完成,你只需要保留每个检出对应哪个修改的列表即可。

或者你也可以在本地使用Git,但我从未尝试过。


3
请注意 - 通过右键上下文菜单“从本地历史记录还原”访问本地历史记录。 - Dave
对于Eclipse部分,这里有一个更具体的答案:https://dev59.com/Z3PYa4cB1Zd3GeqPehOz#18220708 - Sk8erPeter

14

最近犯了一个错误,没有将大约10个新文件的更改提交到SVN,并且由于我的愚蠢错误,它们全部消失了。但是救了我一命的是Windows上的“还原以前的版本”选项,在右键菜单中可以找到。呼,真是松了一口气,也吸取了教训。


谢谢!这让我免去了重新做几个小时工作的麻烦!我以前从未见过 Windows 的这个功能,但它救了我的命! - NibblyPig
我应该把欠你的6000美元发到哪里呢?因为这个程序让我省了好几天的工作时间。我已经领教了... - Dave
我关闭了支持此类还原的检查点,因为它会破坏性能。最近,Eclipse由于其撤消功能出现问题而删除了我的项目文件夹,包括其git存档,我希望我已经开启了检查点。然而,一个名为Recuva的Windows程序通过搜索已删除的文件空间来拯救了我。在恢复所有文件之前,我非常小心地不向受影响的驱动器添加其他内容,并且它提供了自上次备份一周以来更改的每个源文件。二进制文件大多无法恢复。 - Carl

8
如果您使用的是svn命令行客户端,就无法恢复文件。但是,如果您使用的是TortoiseSVN作为您的svn客户端,则可以恢复它们。TortoiseSVN将自动将它们移动到您的回收站中。在意外撤销后,您可以从那里恢复它们。
这是TortoiseSVN中的可配置选项。它位于“设置->对话框1->还原时使用回收站”。默认情况下,它被选中,这意味着文件被移到回收站。如果您想禁用它(通常您不需要禁用它,如果您有理由,请让我知道)。

1
太棒了!...救了我一命。 - Janani Kumar
可悲的是,截至2021年,这似乎不再是事实。 (虽然设置选项仍然存在,但以前更改的本地文件没有进入回收站)如果有一个简单的“您确定要丢弃所有本地更改吗?”提示,那就太好了,因为菜单选项就在提交选项上方,出错很容易发生... - Reahreic

6
如果您正在使用IntelliJ,那么您是一个幸运的人。在顶部菜单中,您有一个版本控制选项,在其中您将找到本地历史选项,您将在其中找到所选文件的所有历史记录,包括您对该文件进行的所有操作(更新、提交、还原)。
祝好运! Arkde

1
如果这是一个新文件,那么文件本身将被删除。在这种情况下,从项目视图中选择文件所在的文件夹,然后选择“本地历史记录”。IntelliJ再次拯救了一天。 - Nufail

4

如果您已经还原了.NET代码(.cs文件等),并且在还原之前进行了更改,但在构建应用程序之后进行了构建,则可以使用任何反射工具从程序集文件中恢复更改以查看代码。


3

我非常幸运地在Eclipse的历史记录浏览器中找到了一个本地文件变更日志(Local Revisions)。在逐个检查差异之前,我已经对该文件进行了几次保存,然后才进行了覆盖。


2
我回退了解决方案(Visual Studio + AnkhSVN),丢失了几个文件的更改。我在回收站中找不到这些文件。
但是,我使用 Handy Recovery 恢复了我的丢失文件,也就是说 SVN 在回退时只是删除了我的文件。
使用任何数据恢复软件来恢复回退的文件(例如试用版 Handy Recovery)。

1
不,SVN不会保留日志或备份(尽管其他答案中有针对TortoiseSVN的解决方案)。但是,如果有人正在浏览答案并且没有注意到OP问题中的这个评论:“幸运的是,在周五下班前我做了一个'svn diff> temp.txt',而且temp.txt文件仍然在我的硬盘上,所以我能够将该文件输入“补丁”并恢复我的丢失更改。” 我想这是一种常见的范例,在执行“svn revert”之前先执行“svn diff”。如果你养成这样的习惯,即使diff只是回显到终端,你至少有一种可能的途径来恢复你丢失的更改。

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