我一直在阅读使用优秀且免费的 Version Control with Subversion 书与 Subversion 1.5 进行分支/合并的内容。我认为我了解如何使用 Subversion 命令行客户端来执行我最需要的操作,它们是:
使用来自主干的更改更新分支
从分支的工作目录运行:
svn 合并 http://svn.myurl.com/proj/trunk
将分支合并到主干
从主干的工作目录运行:
svn merge --reintegrate http://svn.myurl.com/proj/branches/mybranch
但是,我们使用 TortoiseSVN 1.5 作为 Subversion 的接口。我想知道如何最好地使用 TortoiseSVN 执行这些操作。新对话框在主菜单上提供了三个不同的选项。
合并一系列修订重新整合一个分支合并两个不同的树
据我所知,TortoiseSVN 总是使用以下语法执行 svn。
svn merge [--dry-run] --force From_URL@revN To_URL@revM PATH
此外,重新集成分支通常会失败,并显示一条消息,指出某些目标尚未合并,因此无法继续,因此我不得不使用选项 #3。
我的问题是:
如何使用 TortoiseSVN 1.5 将更改从主干合并到分支?如何使用 TortoiseSVN 1.5 将分支合并到主干,使用和不使用 reintegrate 方法?我应该为每个选项使用上述哪个选项,为什么?
编辑
通过“试运行”测试我发现命令行 Subversion 操作
svn 合并 http://svn.myurl.com/proj/trunk
类似于 TortoiseSVN 中的选项 #1(合并修订范围),只要我将修订范围留空。
我无法正确遵循其他答案,这里有更多的傻瓜指南......
您可以通过 trunk -> branch
或 branch -> trunk
的任一方式执行此操作。我总是先trunk -> branch
修复那里的任何冲突,然后合并branch -> trunk
。
将主干合并到分支/标签中
签出分支/标签 右键单击分支的根 |乌龟SVN |合并...合并类型:合并一系列修订 |单击“下一步”合并修订范围:选择您复制到分支/标签的主干目录的 URL。输入要合并的修订或将该字段留空以合并所有修订 |单击“下一步”合并选项:我只是将这些保留为默认值|单击“合并”这会将修订合并到签出的分支/标签中然后将合并的更改提交到分支/标签
行为取决于您的存储库具有哪个版本。 Subversion 1.5 允许 4 种类型的合并:
合并 sourceURL1[@N] sourceURL2[@M] [WCPATH] 合并 sourceWCPATH1@N sourceWCPATH2@M [WCPATH] 合并 [-c M[,N...] | -r N:M ...] SOURCE[@REV] [WCPATH] 合并 --reintegrate SOURCE[@REV] [WCPATH]
1.5 之前的 Subversion 只允许前 2 种格式。
从技术上讲,您可以使用前两种方法执行所有合并,但后两种方法启用 subversion 1.5 的合并跟踪。
TortoiseSVN 的选项在您的存储库为 1.5+ 时将一个范围或修订映射合并到方法 3,或者当您的存储库较旧时合并到方法一。
将功能合并到发布/维护分支时,您应该使用“合并一系列修订”命令。
只有当您想将分支的所有功能合并回父分支(通常是主干)时,您才应该考虑使用“重新集成分支”。
最后一个命令 - 合并两个不同的树 - 仅在您想要超出正常分支行为时才有用。 (例如比较不同的版本,然后将不同的版本合并到另一个分支)
您应该使用“合并一系列修订”。
要将主干的更改合并到分支,请在分支工作副本中选择“合并修订范围”并输入主干 URL 以及要合并的开始和结束修订。
同样以相反的方式在主干中合并一个分支。
关于 --reintegrate 标志,请在此处查看手册:http://tortoisesvn.net/docs/release/TortoiseSVN_en/tsvn-dug-merge.html#tsvn-dug-merge-reintegrate
看看svnmerge.py。它是命令行的,不能被 TortoiseSVN 调用,但它更强大。从 FAQ:
传统的颠覆将让您合并更改,但它不会“记住”您已经合并的内容。它也没有提供一种方便的方法来排除更改集的合并。 svnmerge.py 自动化了一些工作,并简化了它。 Svnmerge 还使用来自它合并的所有事物的日志消息创建提交消息。
Shift-右键单击该文件夹并选择 TortoiseSVN -> Merge All
trunk
和branch
,那么确保尽快合并从trunk
到branch
的所有更改将尽可能避免冲突。这意味着当您将branch
合并到trunk
时,不应该有任何冲突。