在SVN中的功能分支之间合并是否安全?

时间:2012-04-04 16:20:17

标签: svn

如果两个开发人员分别从主干创建一个功能分支,他们可以安全地在他们的功能分支和主干之间“同步合并”,然后仍然能够将每个功能分支重新集成到主干而没有问题吗? / p>

通过“同步合并”我的意思是“svn merge ^ / Project1 / trunk”和“svn merge ^ / Project1 / branches / other-feature-branch”形式的命令,其中svn:mergeinfo属性将跟踪已经从每个地点合并的内容。

我问的原因是我在很多地方都阅读了文档,这些文档表明在分支的相同版本中重新出现会导致冲突问题(尽管我没有在任何地方看到它解释为什么这应该是案子)。如果是这样,那么上面描述的场景应该是有问题的,因为每个功能分支将与主干以及其他功能分支同步,因此在主干中所做的任何更改都将通过直接与主干同步而在同步时收到。另一个功能分支(可能已经选择了相同的主干变化)。

然而,在我完成的测试中,这看起来效果非常好,但在我推荐这个作为我们团队的工作流程之前,我想要一些专家保证。

@nosid:在此编辑中回复nosid,因为对SO的荒谬字符限制会阻止4句评论。什么是Twitter?

我已经阅读了文档。问题在于它描述了一个非常简单的场景,其中一次仅处理一个不稳定特征,并且在特征分支中完成不稳定工作,而所有其他工作在主干中完成。在那种情况下,保持功能分支与主干同步是微不足道的。

然而,在更现实的情况下,产品可以很容易地同时完成几项主要的不稳定工作。那么保持这些工作同步的过程是什么,它们可以根据需要与主干和彼此同步,但不会强迫它们发生重大变化?

3 个答案:

答案 0 :(得分:4)

这不是方法,应该在Subversion中使用功能分支。使用一个简单示例的测试表明,此方法将在以后引发问题。请尝试以下步骤:

  • 创建新存储库。
  • 创建并提交初始结构(主干,分支,标签)。
  • 使用svn cp -m 'new branch' ^/trunk ^/branches/a创建并提交(空)中继的两个新分支以及^/branches/b的相应命令。
  • 在分支b上添加并提交新文件。
  • 将分支b的更改与a的分支svn merge ^/branches/b合并。我没有对主干进行任何更改,因此无需合并。
  • 使用a在主干上重新整合并提交分支svn merge --reintegrate ^/branches/a
  • 使用b将来自主干的更改合并到分支svn merge ^/trunk
  • 现在,您将看到之前添加的文件存在树冲突。

Subversion的文档详细解释了功能分支的推荐用法。请参阅以下链接:Feature Branches。通常从主干创建功能分支。您可以在功能分支上进行自己的更改,并不断将主干中的更改合并到功能分支中(使用svn merge ^/trunk)。一旦完成工作,就将分支重新集成到主干中(使用svn merge --reintegrate ^/branches/name)。重新集成后,功能分支已过时,不应再使用。

答案 1 :(得分:0)

如果您要将两个功能分支相互同步,那么有两个功能分支是什么意思?

他们基本上是一样的。

答案 2 :(得分:0)

这是我对OP问题的看法。您可能会注意到其他来源建议的测试步骤与确定问题答案的一些相似之处,但我得出了不同的结论。

这是我的复制脚本:

#----------------------------------------------------------------------
# Test whether merging between feature branches in SVN results in
# tree conflicts, as claimed elsewhere:
#   http://stackoverflow.com/questions/10015249
#----------------------------------------------------------------------
export REPO=file:///tmp/merge-test/repo

#----------------------------------------------------------------------
# Create a new repository.
#----------------------------------------------------------------------
echo Creating a new repository ...
cd /tmp
rm -rf merge-test
mkdir merge-test
cd merge-test
svnadmin create repo

#----------------------------------------------------------------------
# Create and commit the initial structure (trunk, branches, tags).
#----------------------------------------------------------------------
echo Creating initial structure ...
svn mkdir $REPO/trunk -m "Initializing trunk"
svn mkdir $REPO/branches -m "Initializing branches"
svn mkdir $REPO/tags -m "Initializing tags"

#----------------------------------------------------------------------
# Create and commit two new branches of the (empty) trunk.
#----------------------------------------------------------------------
echo Creating two new branches of the empty trunk ...
svn cp $REPO/trunk $REPO/branches/a -m "branch a"
svn cp $REPO/trunk $REPO/branches/b -m "branch b"
svn co $REPO/trunk
svn co $REPO/branches/a
svn co $REPO/branches/b

#----------------------------------------------------------------------
# Add and commit a new file on branch b.
#----------------------------------------------------------------------
echo Adding and committing a new file on branch b ...
cd b
echo testing > foo
svn add foo
svn ci -m "committing new file"

#----------------------------------------------------------------------
# Merge the changes from branch b to branch a.
#----------------------------------------------------------------------
echo Merging the changes from branch b to branch a ...
cd ../a
svn merge ^/branches/b
svn commit -m "merged b into a"

#----------------------------------------------------------------------
# Reintegrate and commit branch a on the trunk.
#----------------------------------------------------------------------
echo Reintegrating and committing branch a back to the trunk ...
cd ../trunk
svn merge --reintegrate ^/branches/a
svn ci -m "merged a back into trunk"

#----------------------------------------------------------------------
# Merge the changes from the trunk to branch b.
#----------------------------------------------------------------------
echo Merging the changes from the trunk to branch b ...
cd ../b
svn up
svn merge ^/trunk
svn ci -m "refreshing b from trunk"

#----------------------------------------------------------------------
# Look for a tree conflict on the file added earlier.
#----------------------------------------------------------------------
echo Looking for tree conflicts for the file added earlier ...
svn status

最后一个(svn status)命令没有输出,这可能意味着没有树冲突。据我所知,http://svnbook.red-bean.com/中没有明确的声明表明分支之间的合并会导致问题(超出任何合并可能遇到的正常冲突,包括在分支和主干之间合并)。如果有人有证据表明跨分支合并比一般合并更有问题,那么我对检查这些证据非常感兴趣。在此之前,我倾向于告知OP,在实践中没有任何固有的危险。