首页/开发/Git 与协作速查/避免「暗改式」合并提交
合并变基与冲突71 条

避免「暗改式」合并提交

合并冲突时常有人顺手夹带无关改动(业内称 evil merge),这类内容不体现在任一方提交里,评审与 bisect 都难以发现。

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

什么是暗改式合并

解决冲突时顺手夹带无关改动,业内称为暗改式合并。这些改动只存在于合并提交里,不属于任何一方的分支提交,因此评审容易漏看,二分排查也难以定位。它的危害不在于技术难度,而在于不可见。

基本信息

风险合并提交里多出的改动没有独立的提交记录
自查方式查看合并提交本身引入的差异
规范建议冲突解决只保留必要内容,无关修复拆成独立提交
评审重点合并引入的差异是否等于两侧分支的并集

典型使用场景

  • 评审合并提交时确认没有夹带额外改动
  • 排查二分定位不准的问题:怀疑合并提交引入了隐形变化
  • 制定团队规则,把冲突解决与研究性改动分开提交
  • 复盘历史时检查关键合并是否被暗改
  • 把合并提交纳入评审范围,而不是只看两侧分支

检查合并提交

检查合并提交
git show --first-parent --stat <合并提交>   # 从主线一侧看合并引入的差异
git show <合并提交>                         # 查看合并提交的实际差异
git diff <一侧父提交> <合并提交> --stat      # 与指定父提交对比
git range-diff main..feature main..merged    # 对比两段提交之间是否一一对应

检查视角

视角做法能看到什么
合并引入的差异查看合并提交本身多出来的额外改动
与一侧父提交对比指定父提交后比较合并相对该分支的变化
两段提交对照区间差异对比提交是否被改写或替换
评审合并提交时,重点看它引入的差异是否等于两侧分支的并集;多出来的部分一律要求拆分出来单独说明。
把冲突解决之外的改动混进合并提交,会让回退与二分排查都变困难:一次撤销会连带撤掉无关内容。

易错点

  • 查看合并提交时默认可能不做完整展示,需要指定父提交或按主线一侧对照
  • 把冲突解决之外的改动混进合并提交,会让回退与二分排查都变困难
  • 只评审两侧分支的提交而不看合并提交本身,暗改内容就会漏过
  • 团队没有明确规定时,顺手修复的小改动最容易以这种方式进入主干

数据来源与参考

  • Git 官方文档:git-show(合并提交显示规则)
  • Git 官方文档:git-range-diff
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌