69

当一个分支重新整合到主干时,那个分支实际上是死的吗?

您可以在重新集成后对分支进行修改并在以后将它们合并回主干吗?

4

10 回答 10

80

你可以从技术上做到这一点,你的分支没有死也没有被禁用,但不建议在重新集成后从分支合并到主干。

您可以在此处找到有关其原因的完整讨论:Subversion merge reintegrate

基本上,它说,可以将您的更改再次合并到主干,但是由于重新集成迫使您在重新集成操作之前从主干合并到分支,您将面临反射/循环合并,这在 Subversion 1.5 中是非常有问题的.
根据文章,建议在重新集成后立即删除重新集成的分支,并创建一个具有相同(或不同)名称的新分支。

这是一个已知的 Subversion 行为,将在未来版本中解决(可能在 1.6 中)


于 2008-09-23T07:53:28.240 回答
19

实际上,您需要--record-only从主干合并到--reintegrate提交创建的修订分支:

$ 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 章。分支和合并,高级合并

于 2010-05-26T11:21:48.760 回答
8

从分支重新集成到主干后,您应该执行以下两项操作之一:

  • 删除你的分支。这是最简单的,但它使查看分支的历史变得更加困难。

  • 告诉你的分支不要合并 reintegrate commit。如果您重新集成到主干,并将其作为修订版 X 提交,您可以在您的分支上运行此命令:svn merge --record-only -c X url-to-trunk. 但是,如果您在提交过程中进行了任何更改,而不是合并本身,则不应执行此操作。任何其他更改将永远不会回到您的分支。

于 2010-02-24T22:59:36.123 回答
4

如果有人多次对分支进行更改(1.5 之前),有关合并更改的一些建议:记住您在哪个修订版中进行了合并!要么在某处写下修订号,要么(更容易)制作一个标签。(你当然可以稍后找到它,但那是一个 PITA。)

例子:

你有一个这样的存储库布局:

/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
于 2008-09-22T09:08:47.583 回答
2

不,树枝还活着,但是,那一刻,它和树干一模一样。如果你继续在分支上开发,你可以在以后自由地与主干重新合并。

于 2008-09-19T14:53:40.167 回答
2

正如每个人在这里已经说过的那样:分支并没有死,对分支的提交可以继续进行。

有时虽然你想在合并后杀死分支。唯一可靠的解决方案是删除分支。不利的一面是,如果您想查看它,则很难再次找到该分支,例如,出于历史原因。因此,许多人将“重要”分支留在周围,并同意不更改它们。我希望有一种方法可以将分支标记为死/只读,从而确保在另行通知之前没有人可以提交它。

于 2008-09-19T20:22:41.997 回答
1

您可以根据需要多次从分支合并到主干,或从主干合并到分支。

于 2008-09-19T14:53:43.007 回答
1

首先,如果您仍然使用 Subversion 1.7 或更早版本,您应该升级您的 Subversion 客户端和服务器。没有理由使用非常旧的 Subversion 版本。截至 2016 年,当前版本是 Subversion 1.9。现在也支持 SVN 1.8,并且仍然会收到错误修复。

您询问的问题已在 Subversion 1.8 中解决。从 SVN 1.8 开始,--reintegrate选项已弃用。现在自动执行重新整合合并。请参阅与改进相关的 Subversion 1.8 发行说明条目

阅读SVNBook 1.8 | 重新整合一个分支

如果您选择在将分支重新集成到主干后不删除它,您可以继续从主干执行同步合并,然后再次重新集成分支。如果这样做,则只有在第一次重新集成后对分支所做的更改才会合并到主干。

...

只有 Subversion 1.8 支持功能分支的这种重用。早期版本需要进行一些特殊处理,然后才能多次重新集成功能分支。有关详细信息,请参阅本章的早期版本:http: //svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate

于 2016-01-15T09:44:43.217 回答
-1

当您进行合并时,您指定目标。如果您愿意,可以将 TreeA 和 TreeB 的差异合并到 TreeC。正如克里斯暗示的那样,您的问题并没有那么大的意义。如果将分支合并到主干中,则分支保持不变。如果以后不需要该分支,您可以将其删除。

于 2008-09-19T14:56:20.330 回答
-1

您可以继续在分支上进行开发,您需要的功能是 Subversion 1.5 中的合并跟踪,这意味着来自分支的额外合并仅包含新更改。

于 2008-09-19T14:57:08.987 回答