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
相关产品推荐
相关产品推荐

