【问题标题】:Jump back in time in SVN在 SVN 中及时跳转
【发布时间】:2012-06-22 00:50:44
【问题描述】:

我是 SVN 的新手,我对一个问题感到很困惑。我正在使用 Tortoise SVN。

我有一个项目的第 8 版和更高版本的 11 版。在 11 之前,这是一个简单的过程,但现在我必须跳回到第 8 版,顺便说一下,从那开始。我已经制作了 rev8 的工作副本,并进行了一些更改。

我如何将主干的磁带“倒带”到 rev8,并创建一个最近主干的分支,并在 rev8 上提交我的更改,以便结果成为主干?

所有遇到的文档都写了无数关于分支和标记的页面 - 存储库中的实际顶级版本 - 但不是关于过去修订中的这些操作。

【问题讨论】:

    标签: svn version-control tortoisesvn branch


    【解决方案1】:

    这里有不同的信息,因此是一个答案(但@David_W、@maxim1000 和@Wrikken 的答案有助于完成这项工作)。

    很多人偶然发现的是,Subversion 只允许在每个分支的头部工作。这不是一个但是,而是一个特征。因此不可能改写历史,而且你可以放心,没有人会改变历史。

    这就是为什么您必须执行(抽象)步骤的原因:

    1. 在本地签出当前版本。
    2. 在您的本地副本上执行反向补丁(这意味着 r8 到 r11 以相反的顺序)。
    3. 提交这些更改,以便工作副本的新内容(与修订版 8 完全相同)将进入 HEAD。

    【讨论】:

      【解决方案2】:
      1. 检查头部修订
      2. 打开日志
      3. 右键单击要成为新负责人的修订版
      4. 点击“恢复到这个版本”
      5. 提交

      【讨论】:

        【解决方案3】:

        首先,让我们对最近的更改进行分支。我喜欢使用完整的 URL 进行分支:

        $ svn cp svn://localhost/trunk svn://localhost/branches/foo  #Creating branch foo
        

        现在,我们可以从 9 开始删除更改:

        $ svn merge -rHEAD:8 .
        

        请注意,我不必指定用于修订版 8 的标签。这是因为修订版号非常适合充当标签。我通常只标记有趣的修订——超出开发范围的修订,或者我认为以后出于某种原因可能很重要的修订。

        顺便说一句。我也可以按相反的顺序做事:

        $ svn merge -r11:8 .   #Remove changes 9 through 11
        $ svn commit -m "Removing yucky stuff"   #Creates revision #12
        

        哎呀!我应该分支修订版 11!现在就开始吧:

        $ svn copy -r11 . svn://localhost/branches/foo   #Revision #11 is now branch "foo"
        

        如果您更喜欢完整的 URL:

        $ svn copy -r11 svn://localhost/trunk@11 svn://localhost/branches/foo
        

        【讨论】:

        • 确实是更好/更完整的解释。但是,您可以通过 svn cp svn:/source/etc@8 svn://target/etc 避免第一个 svn merge,甚至更少的工作;)
        • @Wrikken 如果修订版 8 可以在分支上并且修订版 11 保留在主干上,那就太好了。但是,OP 想要主干上的版本 8 和分支上的版本 11。我猜他可以 svn mv 中继到一个分支,然后从修订版 8 执行 svn cp 到中继。这也可行,但可能会导致已签出中继的用户出现问题。
        • 是的,我错过了关于 cp 在服务器上的部分,但是 merge 在当前结帐时,我的错。
        【解决方案4】:

        要从给定修订创建分支,只需选择“合并/分支...”,然后选中单选按钮“存储库中的特定修订”并输入修订号 (11)

        要将主干恢复到修订版 8 的状态,请选择“显示日志...”,然后选择要回滚到的修订版 (8),右键单击,然后选择“恢复到此修订”。然后提交。这将创建一个与版本 8 相同的附加版本 (13)。

        确保不要将修订版 13 合并到您从修订版 11 创建的分支中,因为它也会回滚分支中的更改。为确保不会发生这种情况,请将修订版 13 从主干合并到分支中,但选中“仅记录合并”复选框(IIRC)

        【讨论】:

          【解决方案5】:
          svn merge -r11:8 path/
          

          将“还原”从 8 到 11 所做的所有更改。

          【讨论】:

            【解决方案6】:
            1. 结帐后备箱。

            2. 在不同的目录中导出 r8(svn 导出)。这样就避免了“.svn”元目录。

            3. 将所有r8文件复制到trunk中。

            4. 提交。

            (5. 如果 trunk 有其他文件不在 r8 中,您需要手动“svn 删除”这些文件)。

            您可能会猜到,这并不是真正的“倒带”。相反,磁带继续前进,但如果你这样做,r12 会巧合地看起来与 r8 完全一样。 :-)

            【讨论】:

            • ps。您的问题暗示了一个稍微复杂的情况(例如,您似乎还想基于 r11 启动一个新分支?)。如果是这样的话,我可以改进我的答案,但现在我假设一个更简单的场景:你只是想回到过去。
            猜你喜欢
            • 2023-03-10
            • 1970-01-01
            • 1970-01-01
            • 2011-08-15
            • 2018-05-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-28
            相关资源
            最近更新 更多