如何将一个分支合并到主干代码中?

135
我在使用SVN的merge时遇到了一个奇怪的问题。我想要将一个开发分支合并到主干上。 我们同时从主干上切出了多个开发分支。 我正在使用以下命令将其中一个分支合并到主干上:
svn merge trunk branch_1

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

SVN版本:

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


7
我知道这不是一个答案,但是如果你同时有几个活动分支,那么最好转到Mercurial或者Git。附注:我不是一个狂热者,我已经使用SVN工作了约7年;-) - zerkms
2
它提供了什么优势?为什么转向Git或Mercurial是更好的选择? - Vanchinathan Chandrasekaran
3
因为 Git 和 Mercurial 对分支的支持更好。优点是:您将不会问这样的问题,并且在创建和维护分支方面会减少头痛(目前我正在一个拥有 > 1000 个分支的项目中工作,在 svn 中使用它们非常麻烦)。 - zerkms
我建议查看Svnmerge.py,并阅读这篇文章 - chown
4个回答

229

你的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合并章节获取更多详细信息。


请注意,当这篇文章编写时,它是正确的答案(并且被接受的),但事情已经发生了变化。请参阅topek的答案和http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate


5
“--reintegrate”选项并非强制要求,在1.6中,分支可以与任意目标合并多次。 - Lazy Badger
1
真的吗?不冒着重新合并相同的变更集的风险吗?你能提供一个支持这一说法的链接吗? - Neutrino
19
“--reintegrate”选项简单而有效,但必须注意,“一旦从分支到主干执行了“--reintegrate”合并,该分支就不能再用于进一步的工作。它无法正确吸收新的主干更改,也无法正确再次重新集成到主干中。” 正如你提供链接的书中所解释的那样。 - Pino
@Pino,但这本身并不是一件坏事...如果您在执行非重新整合合并后继续使用该分支,同时其他并发分支正在合并到主干中,那么您将不断陷入需要从主干向分支进行前向合并的情况中... - Dave Lawrence
3
@daveL,将主干的更新合并到分支中对我来说是有意义的。然而,我发现了一个高级功能可以“保持已整合的分支处于活动状态”(参见https://dev59.com/sGkw5IYBdhLWcg3wEmWb#10163059),并且较新的客户端版本会自动应用该功能。 - Pino
显示剩余5条评论

81

如果你的工作目录指向主干(trunk),那么你应该能够使用以下命令将分支合并:

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

确保在您的主干目录中执行此命令。


7
从 SVN 1.8 开始,这就是正确的答案。请参阅 http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate。 - GreenAsJade
@blahdiblah 这段代码片段有很多无关信息。研究摘要比研究的任何其他部分都被阅读的数量多,这是有原因的。用户体验测试、最小化跳出率等也是同样的原则。这都是相同的原则。 - ahnbizcad
使用1.7版本,您可以在没有--reintegrate选项的情况下进行合并,并继续在分支上开发和合并。不幸的是,1.8将强制执行此为重新集成,并且似乎没有办法阻止它。这意味着一旦您进行合并,就不能再使用该分支而不经过可怕的“保持活动状态之舞”。 - John Little
4
合并后,别忘了把工作副本提交到代码库中!请注意,提交前请确保工作副本已经保存所有必要的更改。 - John

17

在主干(trunk)执行svn update命令,记录版本号。

从主干开始:

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

您可以通过执行svn log命令来检查分支从主干上的哪里被切割。

svn log --stop-on-copy

由于有多个同时存在的开发分支,这对我也没有用,该命令还会拉取其他分支的更改。也许这是SLik SVN客户端的问题? - Vanchinathan Chandrasekaran
虽然这并不是不准确的,但有更简单的方法与更近期版本的“svn”进行合并(例如OP正在使用的版本)。 - blahdiblah
@VanchinathanChandrasekaran,在您指定分支名称的命令中,应该将其指定为svn://path/to/branch/branchName,这样才能仅拉取该分支的更改而不是其他分支的更改。如果不这样做,我们就有危险了! - Fredrick Gauss

1

语法错误,应该改为

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接