恢复到文件的先前SVN版本的更好方法?


167

我不小心将太多文件提交到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。反向合并使此任务比上面概述的步骤简单(据我所知)。


Answers:


243
svn merge -r 854:853 l3toks.dtx

要么

svn merge -c -854 l3toks.dtx

这两个命令是等效的


5
感谢这个,只是想状态的东西-比方说,我在修订版855,我想将文件恢复到修改854。如果我这样做svn merge -c -854 my.file,然后做svn diff,这似乎显示一个改版前854(即853 ); 仅当我这样做时svm merge -c 854 myfile(不带-),看来myfile才还原到854版本。再次感谢,加油!
sdaau 2010年

11
为什么上面的第一个选项对我来说像魅力一样起作用,而第二个选项根本不起作用,是有原因的吗?
skybondsor 2011年

7
但是,不要忘记在反向合并后提交。我经常忘了:)
Vineeth Pradhan

11
确实应该减去1来表示两个命令之间的区别是什么。答案不佳
生气的丹

4
@sprog-如果有什么不同,我将不胜感激
Orip 2012年

34

查看svn书的撤消更改 ”部分


5
鼓励链接到外部资源,但是请在链接周围添加上下文,以便您的其他用户会知道它是什么以及为什么在那里。如果目标站点无法访问或永久脱机,请始终引用重要链接中最相关的部分。
user2084795 2015年

32

很抱歉,仅重申先前给出的答案就用了一些空间-但这总是给我带来麻烦。

假设我已经将本地文件更新为最新版本,即854。然后,我想获得一个较旧的版本-较早版本的文件版本,例如851。

复制将起作用:

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

..但是,我不能为repo URL烦恼grepping :)

更新似乎可以工作:

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,因为它只会说它已经是“ At854修订版 ”;使用代替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.

2
您应该始终喜欢svn export,因为它确实可以实现您想要的功能-检出某个版本的文件,而反向合并也会尝试将本地更改与指定版本合并,这是一个复杂而疯狂的操作,这是如果不注意,容易出错!
Falco 2014年

1
我在反向合并方面遇到问题。我没有弄清楚原因,而是尝试导出,并且效果很好。我强烈建议仅使用导出。您可以--force用来覆盖目录。只要记住它会覆盖所有更改。
尼克

关于实际发生的事情的很好的解释!我经常使用AnkhSVN和TortoiseSVN,却看不到任何地方可利用svn export-我是否缺少某些东西,或者只是未在这些GUI中实现?
康拉德

@Conrad,您可以通过从存储库上下文(右键单击)菜单中单击AnkhSVN中的“导出...”和TortoiseSVN中的“导出”来使用它
nitinr708

10

我最近不得不恢复到特定的版本来调试旧版本,这就像魔术般起作用:

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

由于我不关心本地更改,因此不得不使用“ tc”选项解决所有冲突(在还原之前检查了我关心的所有内容)

回到首位修订也很简单:

svn up

5

您要查找的内容称为“反向合并”。您应该查阅有关SVN书中的合并功能的文档(如luapyad或更确切地说,该帖子的第一个评论者指出)。如果您使用的是Tortoise,也可以直接进入日志视图,然后右键单击并在出现错误的位置上选择“从该修订版本还原更改”。


4

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


4

如果您只想撤消上一次签到,则可以使用以下命令

svn merge -r head:prev l3toks.dtx

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


4

svn merge将合并修订,而不是还原它们。例如,如果您的HEAD版本中有一些附加内容,然后将其与以前的版本合并,则更改将保留。

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

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

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


3

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

  1. 右键单击要还原的文件(或包含在其中的文件夹,如果您误删除了它们又想重新添加它们)
  2. 选择“ 团队>切换
  3. 选择“修订”单选按钮,然后输入您要还原的修订号。点击确定
  4. 转到“同步”透视图
  5. 选择所有要还原的文件
  6. 右键单击所选内容,然后执行“ 覆盖并提交...

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.