首页/开发/Git 与协作速查/git merge 合并策略选择
合并变基与冲突71 条

git merge 合并策略选择

git merge 支持多个底层策略:ort(当前默认)、resolve、recursive(历史默认别名)、octopus、ours、subtree;日常几乎只用默认,特殊场景才显式指定。

Git 与协作速查开发更新于 2026-10-13

合并策略是什么

合并策略决定 Git 用什么算法把两条历史汇到一起。默认策略会处理三方合并与重命名检测,绝大多数仓库根本不需要显式指定。只有在明确知道结果应该是什么样子时才用得上:例如按目录合并子项目,或者整体以本分支为准。

几种内置策略的用途

ort 是当前默认策略,三方合并与重命名检测较完整;resolve 是较早的算法,现在很少使用;octopus 用于一次合并多个分支;ours 会忽略对方全部内容只留下合并记录;subtree 按子目录对齐进行合并,用于没有使用子模块元数据的旧式布局。

基本信息

适用平台Linux / macOS / Windows(Git 2.x)
语法git merge -s <策略> <分支>
默认策略ort,Git 2.34 起成为默认
常见策略ort、resolve、octopus、ours、subtree
策略选项-X 只影响冲突处理细节,与 -s 不同
使用频率日常合并几乎不需要显式指定

典型使用场景

  • 批量汇入:用 octopus 一次合并多条互不冲突的分支
  • 以本分支为准:用 ours 合入一条内容不需要的分支,只保留合并关系
  • 子项目目录:用 subtree 处理未使用子模块元数据的旧式布局
  • 兼容历史:维护老仓库时遇到 resolve 的历史用法
  • 谨慎排查:非常规合并出现异常时确认实际使用了哪种策略

常用示例

常用示例
git merge feature/login      # 默认策略,常规合并
git merge -s octopus a b c   # 一次合并多个分支
git merge -s ours legacy/old # 忽略对方内容,只记录合并
git merge -s subtree vendor/lib   # 按子目录对齐合并
git merge -X ours feature/login   # 仅冲突块以我方为准

常见策略对照

策略行为使用场景
ort三方合并,重命名检测较完整默认,常规合并
resolve较旧算法,仅文件级三方合并极少使用,历史兼容
octopus一次合并多个分支多分支批量汇入且无冲突
ours忽略对方全部内容,仅记录合并明确以本分支为准
subtree按子目录对齐合并旧式子项目布局
大多数仓库不需要修改合并策略。跨项目合并时优先考虑子树或子模块方案,而不是长期依赖 -s subtree。
-s ours 会彻底忽略对方改动。如果对方分支里其实有需要保留的提交,这一步会静默丢掉它们,事后很难发现。

易错点

  • -s ours 会彻底忽略对方改动,误用可能悄悄丢掉同事的提交,只能用于确实以本分支为准的场景
  • 策略选项 -X 与策略 -s 是两回事:-X ours 只处理冲突块,-s ours 丢弃整棵树的对方内容
  • octopus 遇到冲突会直接失败,需要逐条合并而不是期待它自动解决
  • 在不了解历史布局的情况下使用 subtree,可能把目录结构合到错误的位置

数据来源与参考

  • Git 官方文档:git-merge(MERGE STRATEGIES)
  • Git 2.34 Release Notes(ort 成为默认策略)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌