更好的方式来恢复到以前的SVN版本的文件?

我不小心提交了太多的文件到一个SVN仓库,并改变了一些我并不想要的东西。 (叹气)为了把他们恢复到以前的状态,我能想到的最好的是

svn rm l3toks.dtx svn copy -r 854 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx 

哎呀! 有没有更好的办法? 为什么我不能写这样的东西:

 svn revert -r 854 l3toks.dtx 

好吧,我只使用v1.4.4,但我浏览了1.5分支的更改列表,我看不到任何直接相关的东西。 我错过了什么?


编辑:我想我还不够清楚。 我不认为我想扭转合并,因为那样我就会失去我想做的改变! 说, fileAfileB都被修改,但我只想提交fileA ; 不小心打字

 svn commit -m "small change" 

提交这两个文件,现在我想回滚fileB 。 反向合并使得这个任务比我上面概述的步骤更容易(据我所知)。

 svn merge -r 854:853 l3toks.dtx 

要么

 svn merge -c -854 l3toks.dtx 

这两个命令是等价的 。

检查svn书的 “ 撤销更改 ”部分

抱歉只是重申了以前给出的答案而留出了一些空间 – 但这是我总是遇到麻烦的事情。

比方说,我已经将本地文件更新到最新版本,即854。然后,我想要得到一个较旧的版本 – 早期几个版本的文件版本,说修订851。

复制将工作:

 svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx 

..但是,我不能困扰回购url:)

更新似乎可能工作:

 svn up -r 851 ./l3toks.dtx 

…但是,它也会将本地副本标记为“刚刚检出”,或者与“在线修订”相同(即在“龟”/“RabbitVCS”中,您会收到一个绿色的OK复选标记) – 这意味着您无法执行svn ci -m "rolled back to r 851" :只是因为本地subversion可执行文件不会注意到任何本地更改,并且不会被打扰上传任何东西到联机存储库。

而且,如已经回答的那样,反向合并是可行的 – 但在这种情况下,不应该依赖快捷语法; 但具体说明:

 svn merge -r HEAD:851 l3toks.dtx --- Reverse-merging r854 through r852 into 'l3toks.dtx': U l3toks.dtx 

我必须承认 – 我永远不会理解“ 将r854通过r852反向合并到文件中 ”的意思,意思是“ 刚刚得到了你的文件的r851,并且覆盖了你之前在本地的任何东西 – 它被标记为与最新的在线修订不同,所以你可以在线查看它作为一个新的“回滚”修订 “,但我想(也希望:)),这就是它的作用:)

在这之后,如果我们在本地获得了正确的修订,可以使用svn diff来快速确认; 并且该文件在Tortoise / RabbitVCS中会标有一个红色的感叹号(即与最新的已提交版本不同),所以svn ci -m "rolled back to r 851"就可以运行了。

另外请注意,如果你最终在反向合并之后改变了主意( 也就是说,无论如何你都想继续工作在最新的HEAD版本上,这里是854–在你本地回滚到851之后,但还没有提交回滚 ),你不应该使用svn up ,因为它只是说它已经是“ 在修订854 ”; 使用,而不是svn revert --recursive . 或类似…

干杯!

参考: 如何使用Subversion回滚更改 – 雅各布赖特 – Flex,AIR,PHP等

编辑:…显然,与svn merge -r HEAD:851 l3toks.dtx完全相同的效果,可以实现:

 svn export -r 851 l3toks.dtx A l3toks.dtx Export complete. 

我最近不得不恢复到一个特定的版本来debugging一个较旧的版本,这工作像魔术:

 svn up -r 3340 (or what ever your desired revision number) 

我必须使用“tc”选项解决所有冲突,因为我不关心本地更改(在恢复之前检查了我所关心的所有内容)

回头修改也很简单:

 svn up 

你在找什么叫做“反向合并”。 你应该参考关于SVN书中合并函数的文档(就像luapyad,或者更准确地说,这个文章的第一个评论者指出的那样)。 如果您使用的是乌龟,您也可以直接进入日志视图,然后右键单击,然后从出现错误的地方select“从此版本恢复更改”。

反向合并正是你想要的(见luapyad的答案)。 只需将合并应用于错误提交的文件而不是整个目录。

如果您只想撤销最后一次签入,则可以使用以下内容

 svn merge -r head:prev l3toks.dtx 

这样,你不必寻找当前和以前的版本号。

SVN合并将合并修订,而不是恢复它们。 即,如果您在HEAD版本中添加了一些内容,然后将其与之前的版本进行合并,则更改将保持不变。

我使用svn cat,然后将其redirect到文件中:

 svn cat -r 851 l3toks.dtx > l3toks.dtx 

然后你在这个文件中有851个内容,可以重新检查。

如果您将Eclipse IDESVN插件一起使用,您可以执行如下操作:

  1. 用鼠标右键单击要还原的文件(或者包含它们的文件夹,如果您错误地删除了它们,并且想要将它们添加回去)
  2. select“ 团队>开关
  3. select“修订”放射button,然后input要恢复的修订号。 点击OK
  4. 转到“同步”透视图
  5. select你想要恢复的所有文件
  6. 右键单击select并执行“ 覆盖并提交…

这将把文件恢复到你想要的版本。 请记住,SVN会将这些更改视为新的提交。 也就是说,更改会得到一个新的修订版本号,旧修订版和新版本之间没有链接。 您应该在提交注释中指定您将这些文件恢复为特定的修订版本。