svn-如何在“两个修订版本之间”提交更改?

时间:2018-06-29 14:24:32

标签: svn branch branching-and-merging cherry-pick

问题:

如何在“两个修订版本之间”提交更改?
我使用的是引号,因为显然您不能在两个修订版之间真正提交任何内容-它们已经在存储库中。

长话短说,为什么我需要这个?

开始时这个问题听起来很尴尬,但这是我在工作中遇到的现实生活场景。
我们正在对开发分支(或“功能分支”,fb,也称为它们)进行开发时更改,当工作完成后,我们将合并到主干。
基本的工作流程。
我们从主干发布SW,并且同意在实际发布前几天冻结代码。
现在,我很愚蠢地相信从主干构建的候选发布版本(RC)很好,因为在我们实际发布软件之前,所有自动化测试均已通过并提交了对主干的合并。并删除了功能分支。
假设发布候选版本为42,而我们发布的SW版本为v1.0.3。因此,r42是v1.0.3版的RC。
因此,RC看起来不错,但是在发布SW之前,我将r43提交到了主干。 CI中的所有测试都通过了,所以我去了并删除了分支fb14(修订版44)。
原来RC毕竟不好,需要修复,但是v1.0.3 一定不要包含功能14(在fb14中实现),即r43。

以一种图解形式表示相同:

==r42=======r43
      ^    /
      |   /
      | fb14
      |
commit fix there to get new RC

所以我需要带回r42,提交一些东西,然后带回r43。

好吧,这很容易,对吧?回滚到r42:

svn merge -r HEAD:42 .
svn commit -m "Reverted back to RC of v1.0.3"

实施所需的修复程序并

svn commit -m "Fixed b0rken feature for v1.0.3"

然后我们将发布SW,并携带r43:

svn up
svn merge -c 43 .

但是等等,这什么也没做!我去了并删除了分支fb14,所以我需要从svn中挖掘出来并将其再次合并到主干吗?当然,我一定能够以某种方式带回r43。

所以我有点想要这个:

    roll back to r42
     -------------
    /             \
==r42=====r43=====r45=====r46=====r47
         /   \            ^      /
   merge/     \           |     /
       /       \         fix   /                   
     fb14       \             /
        |        -------------
        |        bring back changes from r43
        |
     deleted in r44

编辑: 嘘,他正在回答自己的问题!
阅读https://stackoverflow.blog/2011/07/01/its-ok-to-ask-and-answer-your-own-questions/
如果/当我再次遇到类似情况时,我想稍后再查找。

1 个答案:

答案 0 :(得分:0)

答案

svn merge -c 43 --ignore-ancestry .
svn commit -m "Introducing feature 14"

解释

为什么

svn merge -c 43 .

在后备箱中不能使用吗?
因为祖先
假设r43中的更改已保存到文件foo.cpp
svn merge记录血统,这是基本知识。有了祖先,我们知道了如何追溯到较早的修订版。对吧?
因此,在提交修订版43时,foo.cpp@42成为foo.cpp@43的祖先。然后我又回到r42并提交r44,并且foo.cpp@43成为foo.cpp@44的祖先。
因此,现在是修订版45,我想合并修订版43。但是我将foo.cpp@44从foo.cpp@42合并,因此将foo.cpp@43基本合并到foo.cpp@45祖先搞砸了。
要使foo.cpp@43成为foo.cpp@45,我需要忽略祖先

svn merge -c 43 --ignore-ancestry .

进一步阅读http://svnbook.red-bean.com/en/1.7/svn.branchmerge.advanced.html#svn.branchmerge.advanced.ancestry

当然可以通过从地下墓穴中挖出分支fb14并再次合并到主干来实现相同的目的

      roll back to r42
    ----------------
   /                \
--r42-----r43-----r45-----r46-----r47
         /                ^      /
        /                 |     /
       /                 fix   /                   
merge fb14---                 /
             \           merge fb14
            delete fb14       

即 (在第43版中)

svn merge -r HEAD:42 .
svn commit -m "Reverted back to RC1 of v1.0.3"

像您从未编码过的代码一样,我们需要立即修复!

svn commit -m "Fixed b0rken feature for v1.0.3"

踢CI机生成软件包并发布软件。

svn cp ^/branches/fb14@43 ^/branches/fb14-2
svn up
svn merge --reintegrate ^/branches/fb14-2
svn commit -m "Introducing feature 14"
svn rm ^/branches/fb14-2

但是我不喜欢这种方法,所以我阅读了有关高级合并的信息。 ;)