我不小心将太多文件提交到 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 分支的更改列表,我看不到任何与此直接相关的内容。我错过了什么吗?
编辑:我想我不够清楚。我不认为我想反向合并,因为那样我将失去我确实想要进行的更改!假设 fileA
和 fileB
都被修改了,但我只想提交 fileA
;不小心打字
svn commit -m "small change"
提交这两个文件,现在我想回滚 fileB
。反向合并使这项任务(据我所知)并不比我上面概述的步骤更容易。
查看 svn book 的“undoing changes”部分
很抱歉仅重复先前给出的答案就占用了一些空间-但这是我总是遇到麻烦的事情。
假设我已将本地文件更新为最新版本,即 854。然后,我想获得一个较旧的版本 - 早期版本的文件版本,例如版本 851。
复制会起作用:
svn copy -r 851 svn+ssh://<repository URL>/l3toks.dtx ./l3toks.dtx
.. 但是,我不会为回购 URL 烦恼 :)
更新似乎可能有效:
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 .
或类似...
干杯!
参考:How to Roll Back Changes using Subversion - Jacob Wright – Flex, AIR, PHP, etc.
编辑:...显然,与 svn merge -r HEAD:851 l3toks.dtx
完全相同的效果可以通过以下方式实现:
svn export -r 851 l3toks.dtx
A l3toks.dtx
Export complete.
--force
覆盖目录。请记住,它将覆盖任何更改。
svn export
- 我是否遗漏了某些东西,或者只是没有在这些 GUI 中实现?
我最近不得不恢复到特定版本来调试旧版本,这就像魔术一样:
svn up -r 3340 (or what ever your desired revision number)
我必须使用“tc”选项解决所有冲突,因为我不关心本地更改(在还原之前检查了我关心的所有内容)
重新开始修订也很简单:
svn up
您正在寻找的内容称为“反向合并”。您应该查阅有关 SVN 书中合并功能的文档(正如 luapyad,或者更准确地说,该帖子的第一个评论者指出的那样)。如果您使用的是 Tortoise,您也可以直接进入日志视图并右键单击并在您犯错的地方选择“恢复此修订版的更改”。
反向合并正是您想要的(请参阅 luapyad 的答案)。只需将合并应用于错误提交的文件而不是整个目录。
如果只想撤消上次签入,可以使用以下
svn merge -r head:prev l3toks.dtx
这样,您就不必寻找当前和以前的版本号。
svn merge 将合并修订,而不是还原它们。即,如果您在 HEAD 版本中添加了一些内容,然后将其与以前的版本合并,那么更改将持续存在。
我使用 svn cat 然后将其重定向到文件中:
svn cat -r 851 l3toks.dtx > l3toks.dtx
然后您在该文件中有 851 内容,并且可以将其重新检入。
如果您使用带有 SVN 插件的 Eclipse IDE,您可以执行以下操作:
右键单击要还原的文件(或它们所在的文件夹,如果您错误地删除了它们并且想要将它们添加回来)选择“团队>切换”选择“修订”单选按钮,然后输入您要恢复到的修订号。单击确定转到同步透视图选择要还原的所有文件右键单击选择并执行“覆盖并提交...”
这会将文件还原为您想要的版本。请记住,SVN 会将更改视为新提交。即变更得到一个新的修订号,旧修订和新修订之间没有联系。您应该在提交注释中指定您将这些文件恢复到特定修订版。
svn merge -c -854 my.file
,然后执行svn diff
,它似乎之前显示了一个修订版854(即853);只有当我执行svm merge -c 854 myfile
(没有-
)时,myfile 看起来才恢复到 rev 854。再次感谢,干杯!