18

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

颠覆书说:

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

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

一篇博文中,Mark Phippard 写道:

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

有没有一个例子说明放弃重新整合会给我带来不必要的冲突?

4

4 回答 4

10

让我解释一下什么时候--reintegrate是绝对必要的。

考虑以下用例。

  1. 您在p1/trunk下有项目p1。该项目有一个文件,,其中一行“line1”<readme.txt
  2. 创建一个新分支,p1/branches/br1
  3. 留在后备箱里。添加行“line2”readme.txt并将其提交到主干
  4. 切换到p1/branches/br1分支。更新到 HEAD。
  5. 从主干合并到此分支(以获取主干更改)。
  6. 你应该有line1并且line2readme.txt
  7. 提交合并结果到p1/branches/br1分支
  8. 切换到主干。更新到 HEAD。
  9. 合并自p1/branches/br1 to trunk.
    1. 你会看到line1,在。所以,你有两次“line2”,这是不正确的。SVN 没有显示任何冲突。因此,这是非常危险的,因为合并执行时没有错误,并且您的印象是一切都很好。line2line2readme.txt

此处的解决方案是应使用--reintegrate选项完成第 9 步合并。reintegrate 选项告诉 SVNbr1与主干进行比较并仅br1将更改应用于主干。在这种特殊情况下,我们没有对br1. 主干中的结果应该是两行“line1”和“line2”。

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

于 2011-08-15T22:02:01.077 回答
3

从来没有必要使用--reintegrate; 这是一种方便。如果您最近的合并 fromtrunk合并了自分支到 revision 以来feature-branch发生的所有更改,那么您可以使用以下命令。trunkrev

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

请注意,此命令将在最新工作副本的根目录中运行,trunk没有要提交的未完成更改。

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

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

包括同步的修订将如下所示:

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

哪里.是主干的干净工作副本,并且Nfeature-branchtrunk. 该合并命令合并了自从它分支以来提交到的所有更改feature-branch,包括那些在创建trunk之后合并的更改。feature-branch这意味着已经进行的更改trunk将包含在上面的合并中。您会告诉 Subversion 将更改应用到trunk实际起源于trunk,这会导致冲突。

于 2009-11-05T17:57:46.030 回答
0

我认为 Mark 的意思是它避免比较两个已修改的文件,一个是从分支重新集成的文件及其在主干中的相应文件,当两者都已同步时(而不仅仅是在各自的分支中本地更改)。

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

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

于 2009-11-05T13:40:48.627 回答
0

从来没有必要使用--reintegrate它——它只是一个别名。如果您有 的工作副本trunk,那么

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

是相同的

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

您可以使用您更喜欢的任何一个。

于 2009-11-05T16:05:12.230 回答