必须右键冲突文件选择“Resolve Conflicts”才能启动三路合并可视化对比,否则仅显示普通文本冲突标记;Merged区初始为空,需手动点击Accept Yours/Theirs填充;未处理的冲突标记会残留并提交。

冲突文件右键点“Resolve Conflicts”才真正启动可视化对比
很多人在 IDEA 里看到红色的 Merge Conflicts 提示后,直接双击文件或点“Accept Yours”,结果改错逻辑、漏删标记、甚至把冲突块整个保留进代码。关键一步被跳过了:必须右键冲突文件 → 选择 Git → Resolve Conflicts,IDEA 才会加载三路合并上下文(LOCAL / BASE / REMOTE),否则你看到的只是普通文本编辑器里的冲突标记。
常见错误现象:
- 点了
Merge弹窗但没选“Resolve Conflicts”,只看到单侧变更 - 在
Local Changes面板里右键选了Compare with Revision,这只会比对工作区和 HEAD,不包含BASE和REMOTE - 用
Ctrl+D快捷键打开的是单文件 diff,不是冲突解决视图
三窗格界面里,中间“Merged”不是自动填充,必须手动确认每一处
IDEA 的冲突解决面板默认分三栏:Yours(当前分支)、Theirs(待合并分支)、Merged(结果)。但 Merged 区域初始是空的,不会自动合并非冲突行——它只高亮冲突区域,其余部分需你主动点击 Accept Yours 或 Accept Theirs 按钮填入。漏点等于漏同步。
使用场景与风险:
- 重构类结构时,
Yours删了一个方法,Theirs改了同名方法体 → 不点任何按钮,Merged就是空的,最终提交会丢失该方法 - 多人协作改同一配置类,
Yours加了新字段,Theirs调整了字段顺序 → 必须逐段检查,不能全选Accept Yours -
Merged区域支持手动编辑,但改完必须点Apply,否则关闭窗口后修改不生效
冲突标记残留 = 没真正解决,而不仅是“看着没红”
IDEA 会在解决完成后自动清理 <<<<<< HEAD、=======、>>>>>> branch-name 这类标记——前提是所有冲突块都被显式处理过。如果某处你跳过了、或点了 Ignore 但没意识到那是有效变更,标记就会原样保留在 Merged 区域里,最终提交的代码里也会带着这些字符串。
验证方式很简单:
- 解决完所有冲突后,在
Merged区域按Ctrl+F搜索<<<<<<,结果应为 0 - 切到
Local Changes面板,看该文件是否还在 “Unversioned Files” 或 “Merged” 分组下;若仍在 “Merge Conflicts” 分组,说明有未处理块 - 执行
git status,输出中不应再出现unmerged files
复杂冲突要回退到命令行验证 BASE 版本
当 IDEA 的三窗格显示模糊(比如两边都改了同一行但看不出谁动了语义),或者你怀疑共同祖先(BASE)版本被误判,就得靠命令行确认。IDEA 渲染依赖 Git 提供的 merge base,但它不展示这个版本原文。
实操步骤:
- 先在 IDEA 中记下冲突文件路径,比如
src/main/java/com/example/Service.java - 终端执行:
git merge-base HEAD origin/feature-x获取共同祖先 commit hash - 再执行:
git show <hash>:src/main/java/com/example/Service.java查看原始BASE内容 - 对比 IDEA 左/右栏和这个原始版本,就能判断哪边是新增、哪边是覆盖
这个动作看似绕,但在金融、支付等强一致性场景里,少一次 git show 可能导致线上金额计算偏差——IDEA 的图形化再直观,也不能替代对三路合并本质的确认。


















