首页/开发/Git 与协作速查/git merge-tree 预演合并与冲突
合并变基与冲突71 条

git merge-tree 预演合并与冲突

不改变工作区即可试算两个分支的合并结果:可只输出冲突信息,也可在对象库中写出合并树,用于 CI 或脚本检查「能否干净合并」。

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

预演合并是什么

它能在不改变工作区、也不建立任何引用的前提下试算两个分支合并的结果,回答「这两个分支能不能干净合并」。新版还可以把试算出的合并树写进对象库,并以退出码表达结论,非常适合放进流水线里做合并可行性检查。

基本信息

用途无副作用地预演合并
基本语法git merge-tree <分支1> <分支2>
新版模式git merge-tree --write-tree <分支1> <分支2>(Git 2.38 起)
结论表达退出码为 0 表示干净,非 0 表示存在冲突
依赖前提本地已有的分支引用

典型使用场景

  • 流水线里提前判断某次变更能否干净并入主干
  • 评审前确认分支是否已经落后到产生冲突
  • 排查「本地能合、服务端不能合」这类环境差异
  • 脚本批量检查一批分支的合并可行性
  • 不想改动工作区时快速试算合并结果

常用示例

常用示例
git merge-tree --write-tree main feature/login                     # 试算合并并写出合并树
git merge-tree --write-tree main feature/login >/dev/null; echo $?  # 只看结论
git fetch origin && git branch -r --sort=-committerdate | head     # 先同步再看分支
git rev-parse --short HEAD                                         # 记录当前提交,确认没有副作用

版本差异

版本行为适用
新版(2.38 起)写出合并树并用退出码表达结论脚本与流水线
旧版基本用法输出冲突与差异文本人工查看
旧版简易模式输出半差异文本流格式难解析,不推荐
不需要检出或记录任何变更就能判断是否会冲突:新版用退出码表达结果,脚本直接判断即可,不必解析文本输出。
试算基于本地已有的引用,结果与索引和工作区无关;判断之前先同步远端,否则结论可能对应过期的分支状态。

放进流水线里的用法

  • 先同步目标分支与候选分支,确保试算基于最新提交
  • 用退出码判断结论,非零就视为存在冲突并中止后续步骤
  • 把冲突文件清单打进日志,方便作者直接定位
  • 需要继续验证时再进入真实的合并流程

易错点

  • 新版与旧版输出格式不同,脚本需要按实际版本适配,不要直接复用他人的解析规则
  • 试算结果与工作区、索引无关,但受本地引用影响,先同步再判断
  • 把试算结论当成最终合并结果,忽略了变基、压缩等不同合并方式带来的差异
  • 只判断能否合并而不看冲突内容,语义层面的冲突依然要靠人处理

数据来源与参考

  • Git 官方文档:git-merge-tree
  • Git 2.38 Release Notes(--write-tree)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌