You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Git合并存在内容差异的main.c时未提示合并冲突的原因

Git合并时无冲突直接替换main.c文件的原因

提交拓扑结构

当前仓库两个分支的提交历史如下:

* 68d0cfc (HEAD -> master) Fixed error in makefile. Command rm is now erasing main.o, too.
| * a2dcb6c (temp_branch) Temporary commit to save progress.
|/  
* c86fd55 structs trans_table_entry and trans_table created. Functions get_trans_table_available_entry, create_insert_new_trans_entry and compare_input_with_trans_key defined.
* b8ba145 structs fsm_t and state_t created. Functions create_fsm, create_new_state and set_fsm_initial_state defined

操作与现象

两个分支下均存在main.c,内容存在明显差异:

  • master分支的main.c为FSM基础功能测试代码,仅创建2个状态、单条转移规则,核心逻辑是测试转移键匹配函数
  • temp_branch分支的main.c为0/1交替序列检测FSM实现,创建4个状态、8条转移规则,核心逻辑是调用执行接口跑通状态机流程

先后执行两条合并命令:

git merge temp_branch
git merge -s resolve master temp_branch

两次命令执行均未抛出合并冲突,输出如下:

Merge made by the 'ort' strategy
fsm.c  | 25 +++++++++++++++++++++++++
fsm.h  |  4 ++--
main.c | 57 +++++++++++++++++++++++++++++++--------------------------
3 files changed, 58 insertions(+), 28 deletions(-)

Trying really trivial in-index merge...
fsm.c  | 25 +++++++++++++++++++++++++
fsm.h  |  4 ++--
main.c | 57 +++++++++++++++++++++++++++++++--------------------------
3 files changed, 58 insertions(+), 28 deletions(-)

最终合并结果中master分支的main.c被直接替换为temp_branch分支的版本,未保留master分支原有的main.c内容。

原因说明

该结果是Git三向合并机制的正常表现,不存在异常:

  • Git执行合并时,会首先找到两个分支的共同祖先提交作为对比基准(本次合并的基准是分叉点c86fd55),对每个文件分别对比「当前分支版本」「待合并分支版本」和「基准版本」的差异
  • master分支在分叉点之后的提交68d0cfc仅修改了makefile的清理规则,完全没有对main.c做任何改动,也就是说master当前的main.c内容和基准提交c86fd55中的main.c完全一致
  • temp_branch分支在分叉点之后的提交a2dcb6c对main.c做了完整修改,和基准版本存在明确差异
  • 按照三向合并的默认规则:如果某一文件仅在待合并分支存在改动、当前分支相对于基准版本无任何改动,Git会直接采纳待合并分支的文件版本,不会触发冲突提示。

两次合并分别使用了ort和resolve两种合并策略,但二者对该场景的判定逻辑一致,因此输出结果完全相同。


内容的提问来源于stack exchange,提问作者EmTor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 23:24:32