将分支合并到主干

Posted

技术标签:

【中文标题】将分支合并到主干【英文标题】:Merge a Branch into Trunk 【发布时间】:2011-11-25 16:40:42 【问题描述】:

我在使用 SVN merge 时遇到了一个特殊问题。我想从开发分支合并到主干。 我们有多个 dev 分支同时切断了主干。

我正在使用以下命令将其中一个分支合并到主干:

svn merge trunk branch_1

我看到不属于此分支的更改被合并到主干中。 我做错了什么?

SVN 版本:

Subversion 命令行客户端,版本 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32。

【问题讨论】:

我知道这不是一个答案,但如果您同时有多个活动分支,那么您最好转移到 mercurial 或 git。 Ps:我不是***分子,我已经使用 svn 大约 7 年了;-) 它有什么优势?为什么迁移到 git 或 mercurial 是更好的选择? 因为 git 和 mercurial 对分支有更好的支持。优点:你不会问这样的问题,并且在创建和维护分支时也不会那么头疼(目前我在一个有超过 1000 个分支的项目中工作,在 svn 中使用它们简直就是地狱) 我建议查看Svnmerge.py 并查看this article。 【参考方案1】:

在trunk中做一个svn更新,注意修订号。

从后备箱:

svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName

你可以通过 svn log 来检查树枝是从哪里剪下来的

svn log --stop-on-copy

【讨论】:

由于有多个 dev 分支同时处于活动状态,这对我也不起作用,这个命令也从其他分支中提取更改。这可能是 SLik SVN 客户端的问题吗? 虽然这不是不准确的,但有更简单的方法可以与svn 的最新版本(例如 OP 正在使用的版本)合并。 @VanchinathanChandrasekaran,在命令中指定分支名称为svn://path/to/branch/branchName,它应该只从该分支而不是从其他分支中提取更改。如果是这样,我们就有危险了!【参考方案2】:

如果您的工作目录指向主干,那么您应该能够将您的分支与:

svn merge https://HOST/repository/branches/branch_1

一定要在你的树干根目录下发出这个命令

【讨论】:

从 SVN 1.8 开始。这是正确的答案。见subversion.apache.org/docs/release-notes/… @blahdiblah 代码 sn-p 有很多无关信息。研究摘要的阅读量比研究的任何其他部分都要多,这是有原因的。 UX 测试、最小化跳出率等也是如此。原理都是一样的。 在 1.7 中,您可以在没有 --reintegrate 选项的情况下合并,并继续在分支上开发并继续合并。可悲的是,1.8 将强制重新整合,而且似乎没有办法阻止它。这意味着一旦你合并,你就不能在不经历可怕的“keep-alive dance”的情况下使用分支 不要忘记在合并后将主干的工作副本提交回存储库!【参考方案3】:

您的svn merge 语法错误。

您想签出trunk 的工作副本,然后使用svn merge --reintegrate 选项:

$ pwd
/home/user/project-trunk

$ svn update  # (make sure the working copy is up to date)
At revision <N>.

$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U    foo.c
U    bar.c
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge branch_1 back into trunk!"
Sending        .
Sending        foo.c
Sending        bar.c
Transmitting file data ..
Committed revision <N+1>.

有关详细信息,请参阅SVN book chapter on merging。


请注意,在撰写本文时,这是正确的答案(并已被接受),但事情已经发生了变化。看topek的回答,还有http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate

【讨论】:

--reintegrate 选项不是强制性的,分支(在 1.6 中)可以与 any-destination 合并任意次数 真的吗?无需冒险重新合并相同的变更集?您能否提供一个链接来证实这一点。 --reintegrate 确实不是强制性的,但在这种情况下确实推荐。我试图在没有--reintegrate 的情况下做到这一点,并以数百次冲突告终。使用--reintegrate,没有冲突,一切都很好! --reintegrate 选项简单有效,但必须注意“一旦 --reintegrate 合并从分支到主干,该分支不再可用于进一步的工作。它不是能够正确吸收新的主干变化,也不能再次正确地重新集成到主干。”正如你所链接的书所解释的那样。 @daveL,从主干到分支的前向合并对我来说很有意义。但是,我发现了一个高级功能,可以“让重新整合的分支保持活力”(请参阅​​ ***.com/a/10163059/685806),此外,更新的客户端版本会自动应用它。【参考方案4】:

语法错误,应该是

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>

【讨论】:

以上是关于将分支合并到主干的主要内容,如果未能解决你的问题,请参考以下文章

SVN 分支到主干合并问题

Git 分支代码合并到主干的命令

idea合并分支到主干

使用 TortoiseSVN 如何将更改从主干合并到分支,反之亦然?

svn合并分支到主干

svn合并分支到主干