svn merge
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 或 工作副本路径 (此时 Subversion 将自动使用工作副本路径对应的 URL). 如果没有指定限定版本号 REV
, 就默认使用 HEAD
. 对于第三种形式, 相同的规则同样适用于 SOURCE1
, SOURCE2
, M
和 N
, 唯一的 不同点是如果 SOURCE1
或 SOURCE2
是一个工作副本路径, 则必须 显式地 指定限定版本号.
自动合并
第一种形式称为 “自动合并”, 它用于执行 “同步” 合并和 “再整合” 合并. “同步” 合并把祖先分支 (
SOURCE
) 中可以合并的修改合并到 目标分支 (TARGET_WCPATH
) 上. “可以合并的” 修改指的是那些还没有从SOURCE
合并到TARGET_WCPATH
的修改, 见 “保持分支同步”一节. “再整合” 合并是把特性分支的修改 (SOURCE
) 合并到祖先分支 (TARGET_WCPATH
) 上, 见 “重新整合分支”一节 和 “特性分支”一节.精选合并
第二种形式称为 “精选” 合并, 用于合并特定的修改, 修改来自
SOURCE
(限定版本号为REV
) 的版本号N
和M
的 比较. 更多的信息见 “精选”一节.提示 -c
或-r
可以出现多次, 也可以混合正向和反向的版本号范围—在合并开始前, Subversion 自动地把版本号范围压缩成最简的表示形式 (这可能会导致空合并或 冲突, 从而导致合并中止).二路 URL 合并
第三种形式称为 “二路 URL 合并”, 限定版本号为
N
的SOURCE1
和限定版本号为M
的SOURCE2
之间的差异将被应用到TARGET_WCPATH
上. 如果省略了限定版本号, 则使用HEAD
.
当两个合并的源路径具有祖先关系时—第一个源路径是另一个源路径 的祖先, 或反之 (自动合并总是符合这一条件—如果 合并跟踪 是可用的, 则 Subversion 会在内部更新合并操作的元数据. 在判断需要合并哪些版本号 时, Subversion 还会把工作副本目标路径上已存在的合并元数据考虑进来, 从而避免重复的合并和不必要的冲突.
和 svn diff 不一样的是, svn merge 在执行合并时还会考虑到文件的祖先, 这在处理下面这种 情况时非常有用: 把一个分支上的修改合并到另一个分支中, 而在其中一个分 支中文件被重命名了.
提示 | |
---|---|
选项 |
选项
--accept
ACTION
--allow-mixed-revisions
--change
(-c
)ARG
--depth
ARG
--diff3-cmd
CMD
--dry-run
--extensions
(-x
)ARG
--force
--ignore-ancestry
--quiet
(-q
)--record-only
--reintegrate
--revision
(-r
)REV
--verbose
(-v
)
示例
把分支重新整合到主干上—假设你已经有了一个处于最新状态 下的主干工作副本 (选项 --verbose
使得 svn merge 在应用差异前打印额外的信息, 这些信息指出了现在 正在执行什么合并. 如果命令的运行时间比较长, 那么打印一些信息就会 很有帮助):
$ 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