compare with saved 是最常用入口,用于对比未保存修改与磁盘原版;file: compare active file with 要求至少一个已打开且激活的文件,支持比对两个已保存文件,但未命名文件无法作为目标,且需统一编码与换行符。

Compare with Saved 是最常用但最容易被忽略的入口
改完代码想立刻看改了哪几行?别先去命令面板搜,直接点编辑器顶部标签右侧的「…」按钮,或右键当前文件标签,选 Compare with Saved。这个操作只对比「当前未保存的编辑内容」和「磁盘上最后一次保存的版本」。
- 如果文件从未保存过,该选项是灰色不可用的——不是 bug,是设计如此
- 对比视图里绿色是新增、红色是删除、黄色背景是修改过的行(注意:不是整行重写,而是有字符级变更)
- 点击行间箭头可一键把改动从左边(原始)应用到右边(当前),或反过来;但不会自动格式化、也不会触发 ESLint 校验
- 关闭对比窗口后,所有状态清空;下次再点,仍是重新计算,不缓存上次结果
File: Compare Active File With 要求“至少一个已打开且激活”
想比两个已保存的文件(比如 config.dev.json 和 config.prod.json),必须先让至少一个在编辑器中打开,且光标落在其中——否则 File: Compare Active File With 命令会灰掉或报 No file to compare with。
- 快捷键是
Ctrl+K→Ctrl+D(Windows/Linux),Cmd+K→Cmd+D(macOS),注意是两组连按,不是同时按 - 如果只打开了一个文件,按快捷键会弹出错误;必须手动再打开第二个(哪怕只是右键资源管理器双击)
- 左侧永远是当前活动文件(即你光标所在的那个),右侧是你选中的目标文件;顺序不能靠拖拽反推,得靠打开顺序或命令选择
- 未命名的临时标签页(如新建后没保存的
Untitled-1)无法作为右侧目标——VS Code 需要有效 URI,没路径就没有 URI
中文乱码、空行错位、差异标红却内容一样?先查编码和换行符
对比结果出现大量误标,大概率不是 VS Code 的问题,而是底层文本属性不一致。右下角状态栏会显示当前文件的 UTF-8、GBK 或 CRLF/LF,两边不统一就会错位。
- 点击右下角编码标识 →
Save with Encoding→ 统一转成UTF-8再比 - 点击右下角换行符标识(
CRLF或LF)→ 选Change End of Line Sequence→ 全部设为LF - 如果只是空格/空行差异干扰判断,进设置搜
files.ignoreTrimWhitespace,关掉它——默认开启时,首尾空格变化会被忽略,导致“看起来一样却标为不同” - 大文件(>50MB)可能直接禁用 diff 计算,标签页上的对比按钮变灰;这不是卡顿,是主动限制,强行开启需改
diffEditor.maxFileSize设置,但风险是 UI 冻结
命令面板 + Git 集成才是跨版本对比的可靠路径
想比工作区和 Git 暂存区、或某次提交的版本?别依赖右键菜单——资源管理器右键只对“当前工作区文件”生效,而 Git 历史版本需要明确上下文。
- 用
Ctrl+Shift+P(macOS 是Cmd+Shift+P)打开命令面板,输Git: Compare HEAD with Working Tree,直接拉出当前修改 vs 最近一次 commit 的差异 - 在源代码管理视图(Ctrl+Shift+G)里,右键已暂存的文件 →
Compare in Staging with Working Tree,专用于查看暂存前后的区别 - 原生不支持比两个任意 commit,但装 GitLens 后可用
GitLens: Compare Branches;不过纯 VS Code 用户建议用终端:git diff commit-a commit-b -- path/to/file.ts - 对比窗口不会监听外部变更——比如你在终端用
git checkout切了分支,已打开的 diff 视图不会刷新,必须手动重开
真正容易被忽略的是:VS Code 的 diff 编辑器不维护文件生命周期。它只做快照式比对,不感知保存、不追踪 Git 状态变更、也不缓存历史差异。每次打开都是全新计算,所以别指望“上次比过的两个文件”能一键复现——路径、编码、甚至是否已保存,都得重新确认一遍。











