更好地恢复到文件的先前SVN修订版的方法?

时间:2008-12-06 06:03:36

标签: 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。反向合并使得这项任务不比我上面概述的步骤更容易(据我所知)。

9 个答案:

答案 0 :(得分:243)

svn merge -r 854:853 l3toks.dtx

svn merge -c -854 l3toks.dtx

两个命令are equivalent

答案 1 :(得分:35)

查看undoing changes

的“svn book”部分

答案 2 :(得分:32)

很抱歉只是在重复之前给出的答案时占用了一些空间 - 但这是我总是遇到麻烦的事情。

假设我已将本地文件更新为最新版本,即854.然后,我想获得一个较旧的版本 - 之前几个版本的文件版本,比如修订版851.

复制可行:

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

..但是,我不能为了回购网址而烦恼:)

更新看似可能有效:

svn up -r 851 ./l3toks.dtx

...但是,它也将本地副本标记为“刚刚签出”,或者更确切地说“与在线修订相同”(即在Tortoise / RabbitVCS中,您将获得绿色OK复选标记) - 这意味着您无法执行{{ 1}}:仅仅因为本地svn ci -m "rolled back to r 851"可执行文件不会注意到任何本地更改,并且不会将任何内容上传到在线存储库。

而且,正如已经回答的那样,反向合并有效 - 但在这种情况下,不应该依赖于快捷语法;但具体说来是:

subversion

我必须承认 - 我永远不会理解句子“将r854反转合并到r852到文件”这意味着“刚刚得到你文件的r851,并覆盖了你以前在本地所做的一切 - 它被标记为与最新的在线修订版本不同,因此您可以在线查看它作为新的“回滚”修订版“,但我猜(并希望:))就是它的作用:) / p>

在此之后,如果我们在本地获得正确的修订,可以使用svn merge -r HEAD:851 l3toks.dtx --- Reverse-merging r854 through r852 into 'l3toks.dtx': U l3toks.dtx 快速确认;此外,该文件将在Tortoise / RabbitVCS中标记为红色感叹号(即与最新提交的版本不同),因此此次svn diff可以运行。

另外,请注意,如果你最后在反向合并之后改变主意(即你仍然希望继续研究最新的,HEAD修订版,这里是854 - 在你回到本地851之后,但是避风港我还没有提交回滚,你不应该使用svn ci -m "rolled back to r 851",因为它只是说它已经是“在修订版854 ”;请改用svn up或类似的......

干杯!

参考:How to Roll Back Changes using Subversion - Jacob Wright – Flex, AIR, PHP, etc.

编辑:......显然,与svn revert --recursive .完全相同的效果可以通过以下方式实现:

svn merge -r HEAD:851 l3toks.dtx

答案 3 :(得分:10)

我最近不得不恢复到特定版本来调试旧版本,这就像魔法一样:

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

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

回到头部修改也很简单:

svn up

答案 4 :(得分:5)

您正在寻找的是“反向合并”。你应该参考SVN书中关于合并功能的文档(作为luapyad,或者更准确地说是该帖子上的第一个评论者,指出)。如果您正在使用Tortoise,您也可以进入日志视图并右键单击并在出错的地方选择“从此修订版还原更改”。

答案 5 :(得分:4)

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

答案 6 :(得分:4)

如果您只想撤消上次登记,可以使用以下

svn merge -r head:prev l3toks.dtx

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

答案 7 :(得分:4)

svn merge将合并修订版,而不是还原它们。即如果您在HEAD版本中添加了一些内容,然后将其与先前版本合并,则更改将保持不变。

我使用svn cat然后将其重定向到文件中:

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

然后你在该文件中有851内容,可以重新检入。

答案 8 :(得分:3)

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

  1. 右键单击要还原的文件(或者包含它们的文件夹,如果您错误地删除它们并且想要将它们添加回来)
  2. 选择“团队&gt;切换
  3. 选择“修订版”辐射按钮,然后输入您要恢复的修订版号。单击“确定”
  4. 转到“同步”视角
  5. 选择要还原的所有文件
  6. 右键点击选择并执行“覆盖并提交...
  7. 这会将文件还原为您想要的修订版。请记住,SVN会将更改视为新提交。也就是说,更改获得新的修订号,旧版本和新版本之间没有链接。您应该在提交注释中指定您将这些文件还原为特定版本。