vscode的“对比差异窗口”不能直接合并分支,仅用于比对;真正合并需git merge/rebase命令。compare active file with是纯文件比对,不感知git上下文,无法处理分支合并;应使用git: compare branches预览差异,冲突时用compare changes三栏视图(含公共祖先)安全解决。

VSCode 的“对比差异窗口”本身不能直接合并分支,它只做比对;真正触发分支合并的是 git merge 或 git rebase 命令,对比窗口只是帮你安全地解决合并过程中产生的冲突。
为什么不能用 Compare Active File With 合并分支
这个命令(File: Compare Active File With)本质是纯文件级文本比对,不感知 Git 上下文。它无法知道你当前在哪个分支、目标分支的共同祖先是谁,更不会写入索引或更新 HEAD。强行把右侧内容 Accept 过去再保存,只是覆盖了本地文件,Git 仍认为你没解决冲突,甚至可能破坏暂存区状态。
- 它适合比对两个独立文件(比如改版前后的 config.json),不是分支合并流程的一部分
- 如果你用它“合并”了某个 .ts 文件,但没运行
git add,Git 会持续报 conflict - 它没有中栏(common ancestor),缺失三路合并的关键依据,容易漏逻辑
真正该用的:Git: Compare Branches
这是 VSCode 内置的分支级比对入口,背后调用的是 git diff branch-a..branch-b,结果反映的是两个分支 tip 提交之间的净变更。
- 执行
Ctrl+Shift+P→ 输入Git: Compare Branches→ 选当前分支和目标分支 - 生成的视图列出所有差异文件,点击任一文件进入双栏 diff(左=当前分支,右=目标分支)
- 这里看到的改动,就是
git merge时 Git 认为“需要拉过来”的内容 - 注意:它不等于 merge 操作本身,只是预览;merge 还得手动执行
git merge target-branch
冲突发生后,用 Compare Changes 三栏视图处理
当 git merge 报 conflict,VSCode 会自动识别冲突块,并提供 Compare Changes 按钮——这才是真正的三路合并上下文。
- 点击冲突文件顶部的
Compare Changes,打开三栏视图:左=HEAD(当前分支)、中=common ancestor(最近公共提交)、右=incoming change(被合并分支) - 只有在这个视图里,“Accept Current Change”和“Accept Incoming Change”才是语义正确的操作
- 中栏不可编辑,但它是判断“哪边改了什么”的唯一依据;跳过它直接 Accept 容易丢逻辑
- 合并后必须手动
git add <file></file>,VSCode 不会自动 stage
容易被忽略的权限与保存细节
很多人点了 Accept 却发现左侧没变,或者保存失败,问题通常不在操作逻辑,而在环境细节。
- 左侧文件如果是只读(比如从
node_modules或 WSL 挂载点来的),VSCode 会拒绝写入,需检查文件系统权限 - Accept 操作只是复制文本,不自动保存;左上角出现 ● 才表示已修改,必须按
Ctrl+S(Windows/Linux)或Cmd+S(macOS) - 如果启用了
files.autoSave,它对 diff 视图无效,仍需手动保存 - 解决完所有冲突后,务必检查是否残留
、<code>=======、>>>>>>—— VSCode 只清理它自己按钮处理过的块,手动编辑过的可能漏掉











