如果始终在合并功能分支之前同步功能分支。为什么你真的必须使用--reintegrate
选项?
Subversion的书中说:
然而,当将你的分支合并回主干时,基础数学是完全不同的。您的功能分支现在是重复主干更改和私有分支更改的混合,因此没有简单的连续修订版本可供复制。通过指定--reintegrate选项,您要求Subversion仅仔细复制您的分支特有的更改。 (事实上,它通过将最新的树干树与最新的树枝树进行比较来实现这一点:产生的差异正是你的树枝变化!)
因此--reintegrate
选项仅合并功能分支唯一的更改。但是如果你总是在合并之前进行同步(这是一种推荐的做法,为了处理功能分支上的任何冲突),那么分支之间的唯一变化就是功能分支独有的变化,对吧?如果Subversion尝试合并已经在目标分支上的代码,它就什么都不做,对吧?
在a blog post中,Mark Phippard写道:
如果我们包含那些同步修订,那么我们合并回已经存在于trunk中的更改。这会产生不必要和令人困惑的冲突。
是否有一个例子表明何时放弃重新整合会给我带来不必要的冲突?
答案 0 :(得分:10)
让我解释一下--reintegrate
是绝对必要的。
考虑以下用例。
readme.txt
,其中一行“line1”< readme.txt
并将其提交到trunk p1/branches/br1
分支。更新到HEAD。line1
line2
和readme.txt
p1/branches/br1
分支p1/branches/br1 to trunk.
合并
line1
中看到line2
,line2
和readme.txt
。所以,你有两次“line2”是不正确的。 SVN没有显示任何冲突。因此,这是非常危险的,因为合并执行时没有错误,并且您的印象是一切都很好。这里的解决方案是使用--reintegrate
选项完成步骤9合并。 reintegrate选项告诉SVN将br1
与中继进行比较,并仅对{3}更改应用于中继。在这种特殊情况下,我们没有对br1
进行任何更改。 trunk中的结果应该是两行“line1”和“line2”。
另一个有用的评论。分支br1
不应再用于第9步之后的开发。如果要在分支中继续开发,请创建一个新分支,例如p1/branches/br1
。从主干到p1/branches/br2
的另一个合并会导致很多冲突。
答案 1 :(得分:3)
永远不必使用--reintegrate
;这是一个方便。如果您从trunk
到feature-branch
的最新合并合并了trunk
中发生的所有更改,因为您已分支到修订版rev
,那么您可以使用以下命令。
svn merge url://trunk@rev url://feature-branch .
请注意,此命令将在trunk
的最新工作副本的根目录中运行,而不会提交任何未完成的更改。
让我扩展我的答案,更直接地回答这个问题“是否有一个例子表明何时放弃重新融合会给我带来不必要的冲突?”
这篇文章的意思是“如果我们包含那些同步修订,那么我们就会合并回已经存在于trunk中的更改。这会产生不必要的和令人困惑的冲突。”
包含同步修订版本如下所示:
svn merge -r N:HEAD url://feature-branch .
其中.
是干线的干净工作副本,N
是feature-branch
从trunk
创建的修订版。该合并命令合并了提交给feature-branch
的所有更改,因为它已分支,包括在trunk
创建后从feature-branch
合并的更改。这意味着已经对trunk
进行的更改将包含在上面的合并中。您将告诉Subversion将更改应用于实际源自trunk
的{{1}},这会导致冲突。
答案 2 :(得分:0)
我认为Mark意味着它避免比较两个已修改过的文件,一个是从分支中重新集成的文件以及它们在中继中的相应文件,当两者都已经同步时(并且不仅仅在各自的分支中进行本地更改)。 / p>
我们假设我们有trunk/a.c
和branches/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
你可以使用任何你更熟悉的人。