前向合并与后向合并的区别

时间:2014-03-21 08:11:42

标签: svn

描述"前进合并"的最简单方法是什么?与#34; Backward Merge"什么时候使用SVN?

3 个答案:

答案 0 :(得分:3)

正向合并向后合并是什么意思?我可以想到两个可能的含义:

  1. 我将更改(或更改)合并到分支或主干中,现在我想撤消该更改。
  2. 我将我的主干合并到一个分支(向前合并?),现在我想将我的分支合并回我的主干(向后合并?)。
  3. 在第一个背景下:

    我在修订版12345中对我的存储库进行了更改。此更改无效,现在我想撤消更改:

    $ svn merge -c -12345 .
    

    这是一个反向合并,我将从Subversion中删除一个特定的更改。这相当于命令:

    $ svn merge -r12345:12344 .
    

    在第二个背景下:

    合并时,通常会执行所谓的三向合并。我创建了一个分支来实现一些功能。在我工作的时候,我想在我的树干上保留我的行李箱上的变化:

    $ svn checkout $REPO/branches/mybranch .
    $ svn merge $REPO/trunk
    

    这是三向合并,可以被认为是前向合并。我希望我在trunk上的更改放在我的分支上,但我不想消除我在分支上所做的更改。为了做到这一点,Subversion将分支与主干比较到分支和主干之间的最后一个共同祖先。

    想象一下我的文件在分支看起来像这样:

    one
    two
    three
    four
    five
    six
    

    我的分支上的文件现在看起来像这样:

    one
    foo
    foo
    four
    five
    six
    

    我的主干上的文件现在看起来像这样:

    one
    two
    bar
    four
    bar
    bar
    

    通过比较文件的预分支版本,Subversion可以看到我在我的分支上更改了第二行和第三行。通过将预分支版本与我的主干进行比较,Subversion可以看到我在我的主干上更改了第三,第五和第六行。

    Subversion只会将第5行和第6行从我的主干合并到我的分支。 Subversion知道第二行只在我的分支上改变了,不应该被触及。但是,Subversion可以看到我的分支和主干上的第三行都被更改了。因此,它会说有一个合并冲突并询问我是否需要第3行的中继版本或第3行的分支版本。

    Subversion确实比这更有点诡计。它不仅仅将分支和主干的头部与最后一个共同祖先进行比较,而是比较分支发生以来主干上的个别修订更改。 Subversion这样做是为了防止我第二次合并更改。它通过使用属性svn:mergeinfo来实现。

    现在,如果你一直在从主干到分支(正向合并?)合并,你的分支包含发生在主干上的所有变化。当我最终想要将我的功能分支合并回我的主干(向后合并?)时,进行三向合并是没有用的。我将比较我的分支上的合并中继信息与中继本身。

    Subversion通过执行双向合并而不是普通的三向合并来处理此问题。这称为 reintegration 。在这种情况下,Subversion只将我的分支与我的主干进行比较,并尝试使我的主干看起来就像我的分支。

    由于Subversion跟踪合并的方式存在实现问题,这就是为什么在执行 reintegration merge 之后需要非常小心重用分支的原因。通常建议锁定或删除分支,如果确实需要再次分支,则从头开始重新创建分支。还有另一种方法使用merge命令的--record-only参数来允许您重用分支。


    因此,在一个上下文中,向后合并是指撤消更改,这意味着正常更改可以被视为前向合并

    在另一个上下文中,将在一个分支或主干上完成的更改合并到另一个分支被视为正向,而向后合并则是指向另一个方向。

    那么,当您询问前进后退合并时,您在谈论哪个上下文?

答案 1 :(得分:1)

我们过去常常在Siemens Healthcare Ultrasound部门使用该语言,其中所有内容都在Rational ClearCase SCM工具下,我希望与SVN密切相关。全世界和不同时区的开发人员都很多,事情的方式就是每个人都拥有自己的用户分支。此分支将在某些修订版本中从主干发起,并且用户将在其工作副本中引入所有本地更改,并在必要时进行任何用户级别签入。一旦开发人员完成他们的工作并准备将这些更改推回到主干,他们将首先执行“ 后合并 ”,将主干的当前状态合并到他们的工作副本,以确保他们解决任何冲突,抓住新的变化,什么不是。一旦完成整理并且没有进一步的签到,他们就会执行 前向合并 将其更改推回到主干。因此,基本上,术语的后退基本上与当前的行李箱状态同步到您的工作副本中,并且向前移动将您的工作副本推入行李箱。

实际上无论“主干”处于什么相对位置,无论是真正的主干,还是带有特殊释放或特征的子分支,都会发生这种情况。我试图找到一个Clearcase版本树浏览器GUI屏幕截图的图像,该屏幕截图显示了在一个用户分支中发生的向前和向后合并,但我能找到的只是这个图像显示在一个部分中发生的向前合并,以及向后合并发生在另一个。但是想象同样的箭头往返于两个分支,每个分支在它们的发展过程中彼此独立地前进。 FYI版本沿着Clearcase中的这些分支垂直堆叠,旧的顶部和新的底部,以便时间轴指向下方。

**更新** 看起来此功能已在修订图表标题下添加到SVN。查看此writeup

  

在修订图中显示“合并箭头”是一个具有的功能   自Subversion推出以来,我们经常被要求   “合并跟踪”。此请求主要来自(前)ClearCase   用户。

Rational Clearcase Version Tree Browser with both merge types displayed

答案 2 :(得分:0)

A"反向合并"正在撤消存储库中的更改,同时保留原始更改和撤消更改的记录。

我将编辑"转发合并"当你澄清的时候。