更好的方法恢复到以前的 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。反向合并使这项任务并不比我上面概述的步骤更容易(据我所知)。

275835 次浏览

看看 Svn 书的“ 撤销改变”部分

你要找的是“逆向合并”。您应该查阅有关 SVN 书中的 merge 函数的文档(正如 luapyad,或者更确切地说是该文章的第一个评论者所指出的那样)。如果你正在使用 Tortoise,你也可以直接进入日志视图,右键点击并选择“从这个修订恢复更改”在你犯错误的地方。

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

svn merge -r 854:853 l3toks.dtx

或者

svn merge -c -854 l3toks.dtx

这两个命令 是等价的

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

假设我已经将本地文件更新到最新版本,即854。然后,我希望得到一个较早的修订版本-该文件的版本从几个早期修订,说修订851。

复制可行:

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

. . 然而,我不能被打扰的回购网址:)

更新似乎可行:

svn up -r 851 ./l3toks.dtx

然而,它也将本地副本标记为“新签出”,或者更确切地说是“与在线版本相同”(例如,在 Tortoise/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-Jacob Wright-Flex,AIR,PHP 等回滚更改。

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

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

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

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

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

回到校长复习上来也很简单:

svn up

如果只想撤消最后一次签入,可以使用以下方法

svn merge -r head:prev l3toks.dtx

这样,您就不必搜索当前版本号和以前版本号。

如果你使用 Eclipse IDESVN 插件,你可以这样做:

  1. 右键单击要还原的文件(或者包含它们的文件夹,如果您错误地删除了它们并想将它们添加回来)
  2. 选择“ 团队 > 开关
  3. 选择“修订”单选按钮,然后输入要恢复到的修订号。单击“确定”
  4. 转到 Synchronize 透视图
  5. 选择要还原的所有文件
  6. 右键单击所选内容并执行“ 重写并提交..。”命令

这将把文件恢复到所需的修订版本。请记住,SVN 将把这些更改视为一个新的提交。也就是说,更改获得一个新的修订号,而且旧的修订号和新的修订号之间没有联系。您应该在提交注释中指定将这些文件恢复到特定的修订版。

Svn 合并将合并修订,而不是还原它们。也就是说,如果您的 HEAD 版本中有一些附加内容,那么将其与以前的版本合并,那么更改将持续存在。

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

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

然后在该文件中包含851内容,并可以将其签入。