本文档尚未完善,内容可能随时变更,可能无法准确描述 Apache™ Subversion® 软件的任何发布版本。将此页面设为书签或推荐给其他人可能不是一个明智的选择。请访问 https://svnbook.subversion.org.cn/ 获取本书的稳定版本。
svn merge - 将两个源之间的差异应用到工作副本路径。
svn merge SOURCE[@REV] [TARGET_WCPATH]
svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]
svn merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]
在所有三种形式中,TARGET_WCPATH
是将接收差异的工作副本路径。如果省略了 TARGET_WCPATH
,则将更改应用于当前工作目录,除非源具有相同的基名,并且与当前工作目录中的文件匹配。在这种情况下,差异将应用于该文件。
在前两种形式中,SOURCE
可以是 URL 或工作副本路径(在这种情况下,将使用其对应的 URL)。如果未指定挂钩修订版 REV
,则假定为 HEAD
。在第三种形式中,SOURCE1
、SOURCE2
、M
和 N
适用相同的规则,唯一的区别是如果任一源是工作副本路径,则必须明确声明挂钩修订版。
自动合并
第一种形式称为“自动合并”,用于执行“同步” 和 “重新集成” 合并。“同步” 合并将分支 (TARGET_WCPATH
) 的祖先分支 (SOURCE
) 中符合条件的更改合并到分支中。“符合条件的” 更改被定义为以前未从 SOURCE
合并到 TARGET_WCPATH
的更改。请参阅 名为“保持分支同步”的部分。“重新集成” 合并将功能分支 (SOURCE
) 的更改合并回功能分支的祖先分支 (TARGET_WCPATH
),请参阅 名为“重新集成分支”的部分 和 名为“功能分支”的部分。
樱桃式合并
第二种形式称为“樱桃式” 合并,用于将明确定义的一组更改从一个分支合并到另一个分支。修订版 REV
中的 SOURCE
与其在提供每个修订版范围内的修订版 N
和 M
之间的状态进行比较。请参阅 名为“樱桃式合并”的部分 了解更多信息。
提示 | |
---|---|
可以指定多个 |
双 URL 合并
在第三种形式中,称为“双 URL 合并”,会生成修订版 N
下 SOURCE1
与修订版 M
下 SOURCE2
之间的差异,并将该差异应用于 TARGET_WCPATH
。如果省略了修订版,则默认值为 HEAD
。
如果合并跟踪 处于活动状态,则当两个合并源是祖先相关的时,Subversion 会在内部跟踪有关合并操作的元数据(即 svn:mergeinfo
属性) - 如果第一个源是第二个源的祖先,反之亦然 - 在执行自动合并时,这一点是保证的。Subversion 还会在确定要合并的修订版以及在努力避免重复合并和不必要的冲突时,将工作副本目标上的现有合并元数据考虑在内,它可能只合并请求范围的子集。
与 svn diff 不同,合并命令在执行合并操作时会考虑文件的祖先关系。当您将更改从一个分支合并到另一个分支时,这一点非常重要,您在一个分支上重命名了一个文件,但在另一个分支上没有重命名。
提示 | |
---|---|
|
将分支重新集成回主干 - 假设您拥有主干的最新工作副本(--verbose
选项打印有关合并正在执行的操作的更多信息,在实际应用任何差异之前;在非常大的情况下很有用,这可能需要很长时间才能完成)
$ svn merge ^/branches/feature-branch-calc-enhancements trunk --verbose checking branch relationship... calculating automatic merge... merging... --- Merging r12 through r37 into 'trunk': U trunk/calc/brush.c --- Recording mergeinfo for merge of r12 through r37 into 'trunk': U trunk $ # build, test, verify, ... $ svn commit trunk -m "Reintegrate the calc enhancements back to trunk!" Sending trunk Sending trunk/calc/brush.c Transmitting file data . Committed revision 38.
樱桃式合并单个更改到文件
$ svn merge ^/trunk/calc/brush.c branches/1.x/calc/brush.c -c38 --- Merging r38 into 'branches/1.x/calc/brush.c': U branches/1.x/calc/brush.c --- Recording mergeinfo for merge of r38 into 'branches/1.x/calc/brush.c': G branches/1.x/calc/brush.c
将两个无关分支之间的差异合并到第三个分支
$ svn merge ^/vendor-drop/vendor-1.0 ^/vendor-drop/vendor-1.1 \ trunk --ignore-ancestry --- Merging differences between repository URLs into 'trunk': U trunk/draw/draw.py