merge: 将修改合并至工作副本。

用法:

  1. merge SOURCE[@REV] [TARGET_WCPATH]
  2. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [TARGET_WCPATH] (拣选合并)
  3. merge SOURCE1[@REV1] SOURCE2[@REV2] [TARGET_WCPATH] (二路 URL 合并)
  1. 这种具有一个源路径且没有版本范围的合并格式称为 “完整” 合并:

    svn merge SOURCE[@REV] [TARGET_WCPATH]

    完整合并用于在下面所描述的 “功能分支” 模式中,完成 “同步” 和 “重新整合” 合并。 它查找源分支上尚未合并到目标分支的所有修改,并将它们合并到工作副本中。合并跟踪用于了解哪些修改已被合并。

    SOURCE 指定要从中提取修改的分支,而 TARGET_WCPATH 指定要对其应用修改的目标分支的工作副本。 通常情况下,SOURCETARGET_WCPATH 应该分别对应于分支的根。(如果只想合并一个子树,那么子树路径必须同时包含在 SOURCETARGET_WCPATH 中;不建议这样做,要避免合并子树。)

    SOURCE 通常是一个版本库 URL 路径。可选的 “@REV” 既指定 URLPEG 限定版本,也指定将要考虑合并的最新版本。如果未指定 REV,则假定为 HEAD 版本。如果 SOURCE 是工作副本路径,则使用该路径所对应的版本库 URL 路径,“REV” 的默认值是基准版本 BASE(通常是最后更新到的修订)。

    TARGET_WCPATH 是工作副本路径;如果省略,则通常假定为 “.” 。但有一些特殊情况:

    通常情况下,使用的工作副本应该是最新的,并且是单个修订版,没有本地修改,也没有切换的子树。

  2. 这种格式叫做 “拣选合并”:

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

    拣选合并用于从一个分支到另一个分支合并指定的版本(或版本范围)。 默认情况下,它使用合并跟踪自动跳过已经合并到目标的任何版本;可以使用 --ignore-ancestry 选项禁用此类跳过。

    SOURCE 通常是一个版本库 URL 路径。可选的 “@REV” 仅指定 URLPEG 限定版本,并不影响合并范围;如果未指定 REV,则假定为 HEAD 版本。如果 SOURCE 是工作副本路径,则使用该路径对应的版本库 URL 路径,“REV” 的默认值是 BASE 基准版本(通常是最后更新到的版本)。

    TARGET_WCPATH 是工作副本路径;如果省略,则通常假定为 “.” 。前面 “完整合并” 格式中提到的特殊情况在此处同样适用。

    要合并的版本范围由 “-r” 和/或 “-c” 选项指定。其中 “-r N:M” 表示源分支的版本历史中版本 NM 之间的差异。还可以 “-c M” 合并单个版本: “-c M” 等效于 “-r <M-1>:M”。每个这样的差异都将应用于 TARGET_WCPATH

    如果 TARGET_WCPATHmergeinfo 指出该范围内的版本已被合并,则在这些版本中所做的修改不会被再次合并。 如果需要,可以将一个范围分为多个子范围,然后分别合并每个子范围。

    “反向范围” 可用于撤消修改。例如,当源和目标引用同一分支时,可以 “撤消” 先前提交的版本。 对于一个相反的版本范围,其 “-r N:M” 中的 N 大于 M,或者 “-c” 选项中使用了负数:“-c -M” 等效于 “-r M:<M-1>”。取消这样的修改也称为执行 “反向合并”。

    可以指定多个 “-c” 和/或 “-r” 选项,并且可以混合使用正向和反向范围。

  3. 这种格式叫做 “两路 URL 合并”:

    svn merge SOURCE1[@REV1] SOURCE2[@REV2] [TARGET_WCPATH]

    仅当其他格式不适用于你的情况时,才应使用此种合并格式,因为掌控该格式非常复杂。

    指定两个源 URL 路径,它们分别标识同一分支或不同分支上的两棵树。比较这两棵树并将从 SOURCE1@REV1SOURCE2@REV2 的差异应用于目标分支在 TARGET_WCPATH 的工作副本。目标分支可以与一个或两个源相同,也可以不同。涉及的三个分支可以完全互不相关。

    TARGET_WCPATH 是工作副本路径;如果省略,则通常假定为 “.” 。 前面 “完整合并” 格式中提到的特殊情况在此处同样适用。

    SOURCE1 和/或 SOURCE2 也可以指定为工作副本路径,在这种情况下,合并源 URL 将从工作副本获取。

以下内容适用于所有类型的合并:

为了防止不必要的合并冲突,svn merge 要求 TARGET_WCPATH 不能是混合版本的工作副本。在开始合并之前运行 “svn update” 可确保工作副本中的所有项目均基于同一个版本。

如果可能的话,在合并之前,不应在合并的目标工作副本中进行任何本地修改,以简化操作。 这样,还原合并和了解分支的历史将更加容易。

在合并过程中也应避免使用切换的子路径,因为它们可能会导致不完整的合并并创建子树的合并信息 mergeinfo

对于每个合并的项目,将输出一行,其中包含一些字符来报告所采取的操作。这些字符具有以下含义:

第一列中的字符报告有关项目本身的信息。第二列中的字符报告有关项目属性的信息。 第三列中的 “C” 表示树冲突,而第一列和第二列中的 “C” 分别表示文件和属性值中的文字冲突。

有效选项:  
-r [--revision] ARG : 指定版本 ARG (一些命令也接受 ARG1:ARG2 格式的版本范围),版本参数可以是如下之一:
  • NUMBER 版本号
  • '{' DATE '}' 在指定时间以后的版本
  • 'HEAD' 版本库中的最新版本
  • 'BASE' 工作副本的基准版本
  • 'COMMITTED' 最后提交的版本或基准版本之前的版本
  • 'PREV' 最后提交版本 COMMITTED 的前一版本
-c [--change] ARG : 版本 ARG (类似 -r ARG-1:ARG) 所作的修改:
  • 如果 ARG 是负数,类似于 -r ARG:ARG-1
  • 如果 ARG 的形式为 ARG1-ARG2,则类似于 -r ARG1:ARG2,其中包括 ARG1
-N [--non-recursive] : 已过时,与 --depth=files 相同
--depth ARG : 限制输出深度为 ARG (empty, files, immediates, 或 infinity)
-q [--quiet] : 不输出信息,或只输出概要信息
--force : 即使删除的内容不匹配也强制删除
--dry-run : 尝试操作,但不做任何更改
--diff3-cmd ARG : 使用 ARG 作为合并命令
--record-only : 仅合并合并信息 mergeinfo 差异
-x [--extensions] ARG : 为外部比较、内部比较、或追溯命令指定比较选项,默认为 “-u”。 各个选项之间使用空白分隔。外部比较和追溯命令使用的选项:
  • -u, --unified: 显示 3 行一致的上下文
  • -b, --ignore-space-change: 忽略空白数量的改变
  • -w, --ignore-all-space: 忽略全部空白
  • --ignore-eol-style: 忽略行尾风格的改变
  • -U ARG, --context ARG: 显示 ARG 行上下文
  • -p, --show-c-function: 显示 C 函数名称
--ignore-ancestry : 禁用合并跟踪;就像相关一样比较节点
--accept ARG : 指定自动解决冲突的措施:
  • postpone 推迟(简写:p
  • working 使用工作副本
  • base 使用 BASE 版本
  • mine-conflict 冲突位置使用我的内容(简写:mc
  • theirs-conflict 冲突位置使用对方内容(简写:tc
  • mine-full 全部使用我的内容(简写:mf
  • theirs-full 全部使用对方的内容(简写:tf
  • edit 编辑内容(简写:e
  • launch 启动合并(简写:l
  • recommended 使用推荐的操作(简写:r
--reintegrate : 不推荐使用
--allow-mixed-revisions : 允许在混合版本工作副本中执行移动操作。不建议使用此选项!请改为运行 “svn update” 来代替
-v [--verbose] : 输出详细信息