将分支合并到树干


125

我面临SVN的一个特殊问题merge。我想从开发分支合并到主干。我们有多个开发分支机构同时切断主干。

我使用以下命令将其中一个分支合并到中继:

svn merge trunk branch_1

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

SVN版本:

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


7
我知道这不是一个答案,但是如果您同时有多个活动分支,那么最好将其转移到mercurial或git。
附言

2
它提供什么优势?为什么改用git或mercurial是更好的选择?
Vanchinathan Chandrasekaran 2011年

3
因为git和mercurial具有更好的分支支持。优点:您不会问这样的问题,并且在创建和维护分支方面会少一些麻烦(目前,我在一个具有1000多个分支的项目中工作,在SVN中与他们一起工作真是个地狱)
zerkms 2011年

我建议研究Svnmerge.py并阅读本文
chown

Answers:


215

您的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


4
--reintegrate选项不是强制性的,分支(在1.6中)可以与任意目的地任意多次合并
Lazy Badger,

1
真?无需冒险合并相同的变更集?您能否提供一个链接来证实这一点。
中微子

--reintegrate确实不是强制性的,但在这种情况下确实推荐使用。我试图做到这一点,但--reintegrate最终却发生了数百次冲突。使用--reintegrate,没有冲突,一切都很好!
tibo 2012年

17
--reintegrate选项简单有效,但必须注意:“一旦--reintegrate从分支到主干完成合并,该分支将不再可用于进一步的工作。它无法正确吸收新的主干更改,也无法正确地重新集成再次中继。” 如您所链接的书所述。
2013年

3
@daveL,从主干到分支的向前合并对我来说很有意义。但是,我发现了一个高级功能,可以“保持重新激活的分支活动”(请参见stackoverflow.com/a/10163059/685806),此外,新版本的客户端会自动应用该功能。
2014年

78

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

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

请确保在中继的根目录中发出此命令


7
从SVN 1.8开始。这是正确的答案。见subversion.apache.org/docs/release-notes/...
GreenAsJade

@blahdiblah该代码段包含许多无关的信息。研究摘要获得的阅读量比研究的任何其他部分都要多,这是有原因的。UX测试,最小化跳出率等也是如此。这都是相同的原理。
ahnbizcad 2015年

使用1.7,您可以不使用--reintegrate选项进行合并,并继续在分支上进行开发并继续合并。可悲的是,1.8将迫使它重新集成,并且似乎没有阻止它的方法。这意味着,一旦合并,您就无法使用分支,而不必经历可怕的“保持生命的舞蹈”
John Little

3
别忘了合并后将主干的工作副本提交回存储库!
约翰,

16

在中继中进行svn更新,记下修订号。

从行李箱:

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

您可以通过执行svn日志来检查从树干上剪下的分支

svn log --stop-on-copy

由于同时有多个dev分支处于活动状态,因此这对我也不起作用,因此该命令也在其他分支中进行更改。可能是SLik SVN客户端有问题吗?
Vanchinathan Chandrasekaran 2011年

尽管这并不准确,但是有更简单的方法可以与最新版本的合并svn(例如一个OP正在使用)。
blahdiblah 2011年

@VanchinathanChandrasekaran,在命令中指定分支名称,因为svn://path/to/branch/branchName该名称只能提取该分支的更改,而不能提取其他分支的更改。如果是这样,我们将处于危险之中!
Fredrick Gauss

1

语法错误,应改为

svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.