什么时候重新整合选项真的有必要?

时间:2009-11-05 13:19:01

标签: svn merge branch svn-reintegrate

如果始终在合并功能分支之前同步功能分支。为什么你真的必须使用--reintegrate选项?

Subversion的书中说:

  

然而,当将你的分支合并回主干时,基础数学是完全不同的。您的功能分支现在是重复主干更改和私有分支更改的混合,因此没有简单的连续修订版本可供复制。通过指定--reintegrate选项,您要求Subversion仅仔细复制您的分支特有的更改。 (事实上​​,它通过将最新的树干树与最新的树枝树进行比较来实现这一点:产生的差异正是你的树枝变化!)

因此--reintegrate选项仅合并功能分支唯一的更改。但是如果你总是在合并之前进行同步(这是一种推荐的做法,为了处理功能分支上的任何冲突),那么分支之间的唯一变化就是功能分支独有的变化,对吧?如果Subversion尝试合并已经在目标分支上的代码,它就什么都不做,对吧?

a blog post中,Mark Phippard写道:

  

如果我们包含那些同步修订,那么我们合并回已经存在于trunk中的更改。这会产生不必要和令人困惑的冲突。

是否有一个例子表明何时放弃重新整合会给我带来不必要的冲突?

4 个答案:

答案 0 :(得分:10)

让我解释一下--reintegrate是绝对必要的。

考虑以下用例。

  1. 您在 p1 / trunk 下有项目 p1 。该项目有一个文件readme.txt,其中一行“line1”<
  2. 创建一个新分支 p1 / branches / br1
  3. 待在后备箱里。将“line2”行添加到readme.txt并将其提交到trunk
  4. 切换到p1/branches/br1分支。更新到HEAD。
  5. 从主干合并到此分支(以获取主干更改)。
  6. 您应该line1
  7. 中有line2readme.txt
  8. 提交将结果合并到p1/branches/br1分支
  9. 切换到主干。更新到HEAD。
  10. p1/branches/br1 to trunk.合并
    1. 您会在line1中看到line2line2readme.txt。所以,你有两次“line2”是不正确的。 SVN没有显示任何冲突。因此,这是非常危险的,因为合并执行时没有错误,并且您的印象是一切都很好。
  11. 这里的解决方案是使用--reintegrate选项完成步骤9合并。 reintegrate选项告诉SVN将br1与中继进行比较,并仅对{3}更改应用于中继。在这种特殊情况下,我们没有对br1进行任何更改。 trunk中的结果应该是两行“line1”和“line2”。

    另一个有用的评论。分支br1不应再用于第9步之后的开发。如果要在分支中继续开发,请创建一个新分支,例如p1/branches/br1。从主干到p1/branches/br2的另一个合并会导致很多冲突。

答案 1 :(得分:3)

永远不必使用--reintegrate;这是一个方便。如果您从trunkfeature-branch的最新合并合并了trunk中发生的所有更改,因为您已分支到修订版rev,那么您可以使用以下命令。

svn merge url://trunk@rev url://feature-branch .

请注意,此命令将在trunk的最新工作副本的根目录中运行,而不会提交任何未完成的更改。

让我扩展我的答案,更直接地回答这个问题“是否有一个例子表明何时放弃重新融合会给我带来不必要的冲突?”

这篇文章的意思是“如果我们包含那些同步修订,那么我们就会合并回已经存在于trunk中的更改。这会产生不必要的和令人困惑的冲突。”

包含同步修订版本如下所示:

svn merge -r N:HEAD url://feature-branch .

其中.是干线的干净工作副本,Nfeature-branchtrunk创建的修订版。该合并命令合并了提交给feature-branch的所有更改,因为它已分支,包括在trunk创建后从feature-branch合并的更改。这意味着已经对trunk进行的更改将包含在上面的合并中。您将告诉Subversion将更改应用于实际源自trunk的{​​{1}},这会导致冲突。

答案 2 :(得分:0)

我认为Mark意味着它避免比较两个已修改过的文件,一个是从分支中重新集成的文件以及它们在中继中的相应文件,当两者都已经同步时(并且不仅仅在各自的分支中进行本地更改)。 / p>

我们假设我们有trunk/a.cbranches/dev/a.c,在某些时候修改了trunk/a.c,稍后在合并中重新集成到分支中。正如您所指出的那样,在将所有东西放回行李箱之前,这是一个很好的做法。

因此,下一步将是合并回主干,其中a.c两侧都是“不同”,因为它们在两个位置都发生了变化。如果没有该选项,将会进行不必要的比较,而--reintegrate将使SVN看到更改不仅仅是本地的。

答案 3 :(得分:0)

永远不必使用--reintegrate - 它只是一个别名。如果您有trunk的工作副本,那么

svn merge --reintegrate url://feature-branch workingcopy

相同
svn merge url://trunk url://feature-branch workingcopy

你可以使用任何你更熟悉的人。