我意外地将太多文件提交到SVN存储库并更改了一些我不想要的东西.(叹气.)为了将它们恢复到先前的状态,我能想到的最好的是
svn rm l3toks.dtx svn copy -r 854 svn+ssh:///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 merge -r 854:853 l3toks.dtx
要么
svn merge -c -854 l3toks.dtx
这两个命令是等效的.
查看svn书籍的 " 撤消更改 "部分
很遗憾只是在重复之前给出的答案时占用了一些空间 - 但这是我总是遇到麻烦的事情.
假设我已经将本地文件更新为最新版本,即854.然后,我想要获得一个较旧的版本 - 之前几个版本的文件版本,比如修订版851.
复制可行:
svn copy -r 851 svn+ssh:///l3toks.dtx ./l3toks.dtx
..但是,我不能为repo 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 .
或类似...
干杯!
参考:如何使用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书中关于合并功能的文档(作为luapyad,或者更确切地说是该帖子中的第一个评论者,指出).如果您正在使用Tortoise,您也可以进入日志视图并右键单击并在出错的地方选择"从此修订版还原更改".