VS Code内置Diff工具可满足日常需求,但需注意打开方式(命令面板或右键)和合并后必须手动保存;Git冲突需用三栏视图及专用按钮处理,并运行git add确认。

VS Code 内置的 Diff 工具足够完成日常代码对比与合并,不需要额外插件——但很多人卡在“怎么打开”和“改了却没生效”这两个环节。
如何快速打开两个文件的 Diff 视图
最直接的方式是用命令面板触发:Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS),输入 File: Compare Active File With...,再选中另一个文件。也可以右键某个文件标签,选择 Compare with Saved(对比未保存修改)或拖拽一个文件到另一个文件标签上松开,自动进入 Diff 视图。
- Diff 视图里左侧是原文件(
ORIGINAL),右侧是目标文件(CHANGED) - 灰色块表示被删除的内容,绿色块是新增内容,黄色块是修改过的行
- 点击行号左侧的
+或→图标可单行合并;点击顶部的Accept All Changes可一次性把右侧所有改动写入左侧文件
为什么点了 Accept 却没更新左边文件?
这是最常见的误解:VS Code 的 Diff 视图默认是只读预览,Accept 操作不会自动保存左侧文件——它只是把右侧内容复制过去,你还得手动 Ctrl+S 保存左侧(即原文件)。如果左侧是只读文件(比如来自 Git 仓库的干净版本),VS Code 会弹出提示,需先取消只读属性或用管理员权限打开文件夹。
- 检查左上角文件名后是否有
●,有说明已修改但未保存 - 确认左侧文件路径是否可写(尤其在 WSL 或远程 SSH 环境下,权限问题更常见)
- 不要依赖
Auto Save:Diff 合并不触发自动保存,必须手动按Ctrl+S
Git 场景下用 Diff 合并冲突文件
当 Git 提示冲突(如 CONFLICT (content): Merge conflict in src/index.ts),VS Code 会自动在编辑器底部显示 Merge Conflict 按钮。点击后进入三栏视图:左(HEAD)、中(冲突标记)、右(incoming change)。这时不能用普通 Diff 命令,而要用顶部的 Accept Current Change / Accept Incoming Change / Accept Both Changes。
- 这些按钮只对当前冲突块生效,不是整文件
- 合并完仍需手动删掉
、=======、>>>>>> branch-name这类 Git 标记(VS Code 通常会自动清理,但如果手动改过冲突块,可能残留) - 最终必须运行
git add把解决后的文件加入暂存区,否则 Git 仍认为冲突未解决
Diff 工具的隐藏限制与替代方案
VS Code 内置 Diff 不支持语法感知合并(比如忽略空格差异或按 AST 合并)、不支持 3-way merge 的完整可视化(仅限 Git 冲突场景)、也不能直接比较文件夹。如果需要这些能力,就得借助外部工具,比如配置 "diffEditor.external" 使用 meld 或 vscode-diff 插件增强。
- 想忽略空格差异?在 Diff 视图右上角点
⋯→ 勾选Ignore Whitespace - 想对比两个不同分支的同一文件?用命令面板运行
Git: Compare Refs...,输入main和feature/login - 频繁处理大文件或二进制文件?内置 Diff 会卡顿甚至崩溃,建议改用命令行
git diff --no-index file1 file2
真正容易被忽略的是:Diff 视图里的“左侧”不一定对应你心里认定的“旧版本”,它的方向取决于你打开的顺序;而合并操作永远以左侧为写入目标——这点一旦搞反,就可能把新功能覆盖成旧逻辑。










