将分支合并到主干
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)>
【讨论】:
以上是关于将分支合并到主干的主要内容,如果未能解决你的问题,请参考以下文章