3

如果两个开发人员各自从主干创建一个功能分支,他们是否可以安全地在他们的功能分支之间以及从主干“同步合并”,然后仍然能够毫无问题地将每个功能分支重新集成到主干?

“同步合并”是指“svn merge ^/Project1/trunk”和“svn merge ^/Project1/branches/other-feature-branch”形式的命令,其中 svn:mergeinfo 属性将跟踪已经从每个位置合并。

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

然而,在我所做的测试中,这似乎工作得很好,但在我推荐它作为我们团队的工作流程之前,我需要一些专家的保证。

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

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

然而,在更现实的情况下,一个产品很容易同时完成几个主要的不稳定工作。那么保持这些工作同步的过程是什么,以便它们可以按需与主干和彼此同步,但又不会对它们强制进行破坏性更改?

4

3 回答 3

4

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

  • 创建一个新的存储库。
  • 创建并提交初始结构(主干、分支、标签)。
  • 创建并提交(空)主干的两个新分支,svn cp -m 'new branch' ^/trunk ^/branches/a并使用^/branches/b.
  • 在分支上添加并提交一个新文件b
  • 合并从一个分支b到另一个分支a的更改svn merge ^/branches/b。我没有对主干进行任何更改,所以没有什么要合并的。
  • 使用.reintegrate 并a在主干上提交分支svn merge --reintegrate ^/branches/a
  • 合并从主干到分支的b更改svn merge ^/trunk
  • 现在,您将在之前添加的文件上看到树冲突。

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

于 2012-04-04T19:21:08.023 回答
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 在实践中没有任何固有的危险。

于 2015-04-24T15:01:37.953 回答
0

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

它们基本上是相同的。

于 2012-04-04T16:30:35.117 回答