首页 文章

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

9 回答

  • 3
    svn merge -r 854:853 l3toks.dtx
    

    要么

    svn merge -c -854 l3toks.dtx
    

    这两个命令are equivalent .

  • 5

    查看svn book的“undoing changes”部分

  • 10

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

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

    复制可行:

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

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

    看似可能有效:

    svn up -r 851 ./l3toks.dtx
    

    ...但是,它也将本地副本标记为"freshly checked out",或者更确切地说是"same as online revision"(即在Tortoise / RabbitVCS中你得到一个绿色OK复选标记) - 这意味着你不能做 svn ci -m "rolled back to r 851" :只是因为本地 subversion 可执行文件赢得了't notice any local changes, and won' t将任何内容上传到在线存储库 .

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

    svn merge -r HEAD:851 l3toks.dtx
    --- Reverse-merging r854 through r852 into 'l3toks.dtx':
    U    l3toks.dtx
    

    我必须承认 - 我永远不会理解句子“将r854到r852反向合并到文件中" to mean "刚刚获得了你文件的r851,并覆盖了你以前在本地的任何内容 - 它被标记为与最新的在线修订不同,所以你可以检查它在网上作为一个新的'rollback'修订版“,但我猜(并希望:))就是这样:)

    在此之后,如果我们在本地获得正确的修订版,可以使用 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.
    
  • 35

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

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

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

    要回到头部修改也很简单:

    svn up
    
  • 32

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

  • 4

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

  • 4

    如果您只想撤消上次签入,可以使用以下内容

    svn merge -r head:prev l3toks.dtx
    

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

  • 243

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

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

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

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

  • 4

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

    • 右键单击要还原的文件(或者包含它们的文件夹,如果您错误地删除它们并且想要将它们添加回来)

    • 选择“ Team > Switch

    • 选择"Revision" radion按钮,然后输入您要恢复的版本号 . 单击确定

    • 转到“同步”透视图

    • 选择要还原的所有文件

    • 右键单击选择并执行“ Override and Commit...

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

相关问题