本手册旨在描述 Apache™ Subversion® 的 1.7.x 系列。如果您正在运行其他版本的 Subversion,强烈建议您访问 https://svnbook.subversion.org.cn/ 并查阅适合您 Subversion 版本的手册。

名称

svn merge — 将两个源之间的差异应用到工作副本路径。

概要

svn merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH]

svn merge --reintegrate SOURCE[@REV] [TARGET_WCPATH]

svn merge SOURCE1[@N] SOURCE2[@M] [TARGET_WCPATH]

描述

在所有三种形式中,TARGET_WCPATH 是将接收差异的工作副本路径。如果省略了 TARGET_WCPATH,则更改将应用于当前工作目录,除非源具有相同的基名,并且与当前工作目录中的文件匹配。在这种情况下,差异将应用于该文件。

在前两种形式中,SOURCE 可以是 URL 或工作副本路径(在这种情况下,将使用其对应的 URL)。如果未指定挂钩修订版 REV,则假定为 HEAD。在第三种形式中,SOURCE1SOURCE2MN 适用相同的规则,唯一的区别是,如果任一源是工作副本路径,则必须明确指定挂钩修订版。

  • 同步和 Cherrypick 合并

    第一种形式,当不使用 -c-r 选项时,称为 同步 合并,并且隐含 -r 1:REV。此变体用于将所有符合条件的更改从分支合并到其直接祖先分支,请参阅 名为“保持分支同步”的部分

    当第一种形式与 -c-r 选项一起使用时,这称为 Cherrypick 合并,用于将明确定义的更改集从一个分支合并到另一个分支,请参阅 名为“Cherrypicking”的部分

    [Tip] 提示

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

    在第一种形式的两种变体中,修订版 REV 中的 SOURCE 被比较,就像它在每个提供的修订版范围内,在修订版 NM 之间存在一样。

  • 重新整合合并

    第二种形式称为 重新整合合并,用于将来自特性分支 (SOURCE) 的更改带回特性分支的直接祖先分支 (TARGET_WCPATH)。

    [Tip] 提示

    重新整合合并只支持这种专门的用例,因此具有一些其他两种合并形式所不具备的特殊要求和限制。请参阅 名为“保持分支同步”的部分名为“重新整合分支”的部分名为“保持重新整合的分支存活”的部分 以及 名为“特性分支”的部分

  • 2-URL 合并

    在第三种形式中,称为 2-URL 合并,生成修订版 N 处的 SOURCE1 和修订版 M 处的 SOURCE2 之间的差异,并将其应用于 TARGET_WCPATH。如果省略,修订版默认为 HEAD

如果 合并跟踪 处于活动状态,则当两个合并源在祖先上相关时,Subversion 会在内部跟踪有关合并操作的元数据(即 svn:mergeinfo 属性)——如果第一个源是第二个源的祖先,反之亦然——在使用前两种形式时,这将得到保证。Subversion 还会在确定要合并的修订版时考虑工作副本目标上的预先存在的合并元数据,并为了避免重复合并和不必要的冲突,它可能只合并请求范围的子集。

[Tip] 提示

合并跟踪 可以使用 --ignore-ancestry 选项禁用。

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

选项

示例

将分支合并回主干(假设您拥有主干的最新工作副本)

$ svn merge --reintegrate \
            http://svn.example.com/repos/calc/branches/my-calc-branch
--- Merging differences between repository URLs into '.':
U    button.c
U    integer.c
U    Makefile
 U   .
--- Recording mergeinfo for merge between repository URLs into '.':
 U   .

$ # build, test, verify, ...

$ svn commit -m "Merge my-calc-branch back into trunk!"
Sending        .
Sending        button.c
Sending        integer.c
Sending        Makefile
Transmitting file data ..
Committed revision 391.

要合并对单个文件的更改

$ svn merge -c 31 ^/trunk/thhgttg.txt thhgttg.txt 
--- Merging r31 into 'thhgttg.txt':
U    thhgttg.txt
--- Recording mergeinfo for merge of r31 into 'thhgttg.txt':
 U   thhgttg.txt
TortoiseSVN 官方中文版 1.14.7 发布