本文档尚未完善,内容可能随时变更,可能无法准确描述 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。在第三种形式中,SOURCE1SOURCE2MN 适用相同的规则,唯一的区别是如果任一源是工作副本路径,则必须明确声明挂钩修订版。

  • 自动合并

    第一种形式称为自动合并,用于执行同步重新集成 合并。同步 合并将分支 (TARGET_WCPATH) 的祖先分支 (SOURCE) 中符合条件的更改合并到分支中。符合条件的 更改被定义为以前未从 SOURCE 合并到 TARGET_WCPATH 的更改。请参阅 名为“保持分支同步”的部分重新集成 合并将功能分支 (SOURCE) 的更改合并回功能分支的祖先分支 (TARGET_WCPATH),请参阅 名为“重新集成分支”的部分名为“功能分支”的部分

  • 樱桃式合并

    第二种形式称为樱桃式 合并,用于将明确定义的一组更改从一个分支合并到另一个分支。修订版 REV 中的 SOURCE 与其在提供每个修订版范围内的修订版 NM 之间的状态进行比较。请参阅 名为“樱桃式合并”的部分 了解更多信息。

    [Tip] 提示

    可以指定多个 -c 和/或 -r 实例,并且允许混合正向和反向范围 - 这些范围在合并开始之前会在内部压缩到其最小表示形式(这可能会导致无操作合并或冲突,从而导致合并在合并所有请求的修订版之前停止)。

  • 双 URL 合并

    在第三种形式中,称为双 URL 合并,会生成修订版 NSOURCE1 与修订版 MSOURCE2 之间的差异,并将该差异应用于 TARGET_WCPATH。如果省略了修订版,则默认值为 HEAD

如果合并跟踪 处于活动状态,则当两个合并源是祖先相关的时,Subversion 会在内部跟踪有关合并操作的元数据(即 svn:mergeinfo 属性) - 如果第一个源是第二个源的祖先,反之亦然 - 在执行自动合并时,这一点是保证的。Subversion 还会在确定要合并的修订版以及在努力避免重复合并和不必要的冲突时,将工作副本目标上的现有合并元数据考虑在内,它可能只合并请求范围的子集。

svn diff 不同,合并命令在执行合并操作时会考虑文件的祖先关系。当您将更改从一个分支合并到另一个分支时,这一点非常重要,您在一个分支上重命名了一个文件,但在另一个分支上没有重命名。

[Tip] 提示

--ignore-ancestry 选项将导致合并跟踪 被禁用,并使合并行为类似于 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
TortoiseSVN 官方中文版 1.14.7 发布