当一个分支被重新合并到主干后,该分支是否已经无效?
在重新合并之后,您是否可以对分支进行修改,并将其合并回主干的较晚时间?
从技术上来说,你是可以这么做的,你的分支既没有死亡也没有被禁用,但是不建议在重新集成后从分支合并到主干。
你可以在这里找到关于原因的完整讨论:Subversion merge reintegrate
基本上,文章中提到,虽然可能将修改再次合并到主干,但由于重新集成强制你在重新集成操作之前从主干合并到分支,你将面临循环合并的问题,这在Subversion 1.5中非常棘手。
根据文章内容,建议在重新集成后立即删除已经重新集成的分支,并创建一个同名或不同名的新分支。
这是已知的Subversion行为,未来版本(可能是1.6版)将加以解决。
实际上,您需要在使用--reintegrate
提交创建的版本修订的分支中,执行从主干到分支的--record-only
合并:
$ cd trunk
$ svn merge --reintegrate ^my-branch
$ svn commit
Committed revision 555.
# This revision is ^^^^ important
现在你可以记录它了
$ cd my-branch
$ svn merge --record-only -c 555 ^trunk
$ svn commit
你现在很乐意保留这个分支。
更多信息请见第4章 分支和合并,高级合并。
当你从分支合并到主干后,你应该做以下两件事中的一件:
删除你的分支。这是最简单的方法,但它会使得分支的历史更难查看。
告诉你的分支不要合并重新集成的提交。如果你将分支重新集成到主干,并将其作为修订版本 X 提交,那么你可以在分支上运行此命令:svn merge --record-only -c X url-to-trunk
。但是,如果你在提交中进行了除合并之外的任何更改,则不应进行此操作。其他任何更改都永远不会回到你的分支。
如果有人多次对分支进行更改(1.5之前),以下是合并更改的建议:记住您进行合并的修订版本!要么在某处写下修订版本号,要么(更简单)创建一个标签。(当然,您以后可以找到它,但那很麻烦。)
示例:
您的存储库布局如下:
/your_project
/trunk
/branches
/tags
假设这是一个Web应用程序,你计划发布。你将创建一个标签,并从那个标签(或主干)创建一个分支,在其中进行错误修复:
/your_project
/trunk
/branches
/1.0.0-bugfixes
/tags
/1.0.0
通过这种方式,您可以将新功能集成到主干中。所有的错误修复都只会在错误修复分支中进行,在每次发布之前,您需要对当前版本(现在来自于错误修复分支)进行标记。
假设您已经进行了相当数量的错误修复,并将其发布到生产服务器上,您急需其中一个功能位于当前主干中:
/your_project
/trunk
/branches
/1.0.0-bugfixes
/tags
/1.0.0
/1.0.1
/1.0.2
现在您可以直接将1.0.0和1.0.2之间的更改集成到您的主干代码中(假设您在您的工作副本中):
svn merge http://rep/your_project/tag/1.0.0 http://rep/your_project/tag/1.0.2 .
以下是您需要记住的事情。您已经将1.0.0和1.0.2之间的更改合并到主干上。假设当前生产版本中存在更多更改:
/your_project
/trunk
/branches
/1.0.0-bugfixes
/tags
/1.0.0
/1.0.1
/1.0.2
/1.0.3
/1.0.4
您现在已经准备好从主干版本发布新版本,但您的错误修复的最后更改仍然缺失:
svn merge http://rep/your_project/tag/1.0.2 http://rep/your_project/tag/1.0.4 .
现在您已经将所有更改合并到主干上,可以进行发布(不要忘记先进行测试)。
/your_project
/trunk
/branches
/1.0.0-bugfixes
/1.1.0-bugfixes
/tags
/1.0.0
/1.0.1
/1.0.2
/1.0.3
/1.0.4
/1.1.0
不,分支仍然存在,但此时它与主干完全相同。如果您继续在分支上开发,稍后可以自由地重新与主干合并。
正如大家在这里已经说过的:该分支并没有死亡,可以继续提交到该分支。
有时候,在合并后你可能想要删除该分支。唯一可靠的解决方案是删除该分支。缺点是,如果你因历史原因想再次查看它,那么找到该分支就更难了。因此,许多人会将“重要”的分支保留下来,并达成不更改它们的协议。我希望有一种方法可以标记一个死/只读分支,从而确保在另行通知之前,没有人可以向其提交。
--reintegrate
选项已被弃用。重新集成合并现在将自动执行。请参见与改进相关的Subversion 1.8发行说明条目。您可以随意将分支合并到主干,或将主干合并到分支中。
当你执行合并操作时,需要指定目标。如果需要,你可以将TreeA和TreeB的差异合并到TreeC中。正如Chris所暗示的那样,你的问题并没有太多意义。如果将你的分支合并到主干上,分支将保持不变。如果之后不再需要该分支,你可以将其删除。