VSCode的Compare视图仅做静态文本比对,不识别Git冲突标记、无Accept按钮和Result区;真正解决冲突需用Merge Editor,通过SCM面板右键Resolve、命令面板执行Git: Open Merge Editor或确保git.mergeEditor为true触发三栏/四窗格视图,解决后必须手动git add。

VSCode 的代码对比窗口本身不解决 Git 合并冲突,它只做纯文本比对;真正在处理冲突时起作用的是 Merge Editor(合并编辑器),不是 Compare Active File With 那种双栏视图。
为什么“Compare with…”不能解决 Git 冲突
你右键选两个文件 → Select for Compare,或用 File: Compare Active File With 命令打开的,是静态文件对比视图。它:
- 完全脱离 Git 状态,不识别
<<<<< HEAD这类标记 - 不会显示
Accept Current Change按钮,也没Result编辑区 - 右侧若为只读文件(如
node_modules里的),连编辑都不行 - 哪怕你手动删了冲突标记再保存,
git add仍会报fatal: cannot lock ref
真正触发 Merge Editor 的 3 种可靠方式
只有进入 Merge Editor,才能看到三栏(Current / Incoming / Result)或四窗格(CURRENT / REMOTE / BASE / MERGED),按钮才有效:
- 在源代码管理面板(
Ctrl+Shift+G)里,右键状态为both modified的文件 →Resolve in Merge Editor - 命令面板(
Ctrl+Shift+P)输入Git: Open Merge Editor—— 注意不是Compare...或Open Changes - 确保
git.mergeEditor设置为true(VSCode 1.84+ 默认开启,但老工作区可能关着)
Accept Both Changes 是最危险的快捷操作
这个按钮名字听着很友好,实际只是把左右两段文本按顺序拼起来,不做任何逻辑校验:
- 两边都写了
import axios from 'axios'?→ 结果里出现两行重复导入 - 都改了
config.timeout,值分别是5000和10000?→ 中间区直接堆两行赋值,后者覆盖前者,原始意图全丢 - 一方删函数、一方改调用?→ Accept Both 会留下已删除函数的调用,编译直接失败
真要融合逻辑,必须手动进 Result 栏编辑,并删干净所有 <<<<< HEAD、=======、>>>>> branch-name —— 漏掉任意一行,git add 就拒绝执行。
解决后必须手动 git add,VSCode 不会帮你提交状态
点完 Accept、改完 Result、按了 Ctrl+S,只是把内容写进磁盘。Git 仍然认为文件处于未解决状态:
- 底部状态栏不会变灰提示“all staged”,也不会自动跳到提交界面
- 你得右键文件 →
Stage Changes,或终端敲git add <file> - 所有冲突文件都
Stage完,状态栏显示All changes staged for commit,才算真正结束
容易被忽略的是:VSCode 从不验证你写的 Result 是否语法合法、是否引入空指针、是否破坏接口契约——它只管结构,不管语义。


















