ctrl+k ctrl+d 是专用于对比当前编辑器内容与磁盘已保存版本的硬编码命令,仅对有路径且曾保存过的文件生效;git: open changes 用于对比工作区与 head;compare files 和 timeline 中的 git 记录点击才触发对应差异计算。

Ctrl+K Ctrl+D 是对比未保存修改的唯一快捷键
这个组合不是“可选之一”,而是专为「当前编辑器内容 vs 磁盘已保存版本」设计的硬编码命令,对应 workbench.action.compareEditorWithSaved。它不依赖 Git、不检查仓库状态,只要文件有真实路径且已保存过至少一次就能触发。
常见错误现象:Ctrl+K Ctrl+D 按下后无反应或弹出“无法与磁盘比较”——说明该文件是 Untitled-1 这类未命名临时文件,或从未执行过保存操作(Ctrl+S)。VS Code 不会为无 URI 的内容生成 diff 基准。
- 左侧永远显示磁盘原始内容,右侧是当前未保存的编辑结果,顶部明确标注
UNSAVED CHANGES - 点击左侧行旁的
→图标,可将该行/块复制到右侧(即撤销本次修改),不会触发格式化或 lint 校验 - 关闭对比标签页后状态完全清空,下次再用仍是重新计算,不缓存中间 diff 结果
Git: Open Changes 是查看工作区 vs HEAD 的最快入口
想确认“这次改完之后,和上一次 commit 相比到底动了哪些地方”,就该用 Git: Open Changes,而不是右键菜单里的“Compare with HEAD”。后者在多根工作区或非 Git 文件夹里容易灰掉,而前者会自动聚焦当前编辑器打开的文件,并只渲染该文件的差异。
如果命令面板搜不到 Git: Open Changes,优先检查三件事:.git 文件夹是否存在、当前焦点是否落在 Git 仓库内、是否有第三方 Git 插件禁用了原生命令。
- 左半边是
HEAD(即最近一次 commit)的内容,右半边才是你的修改 —— 很多人盯着右边改逻辑,却没注意左边某段代码其实在上个 commit 里已被移除 - 该命令默认只对已 git track 的文件生效;新建文件未
git add时,VS Code 认为“和 HEAD 比没有变化”,实际是“还没进索引” - 若右下角状态栏没显示分支名,说明 VS Code 没加载 Git 上下文,此时命令不可用
Compare Files 命令对路径和编码敏感
File: Compare Active File With 表面看是通用文件对比入口,但实际运行时强依赖两个前提:至少一个目标文件必须已在编辑器中打开并处于激活状态;另一个目标文件必须有完整文件系统路径(不能是 Untitled-1)。
中文乱码、空行错位、整段标红但内容一致?大概率是两边文件编码或换行符不统一。右下角状态栏会显示当前文件的 UTF-8/GBK 和 CRLF/LF,不一致就会导致 diff 错位。
- 对比前先统一换行符:点击右下角
CRLF或LF→ 选Change End of Line Sequence→ 全部设为LF - 若只想忽略首尾空格差异,进设置搜
files.ignoreTrimWhitespace并关闭它(默认开启) - 大文件(>50MB)会被主动限制 diff 计算,标签页上的对比按钮变灰;强行开启需改
diffEditor.maxFileSize,但 UI 可能冻结
Timeline 视图里点 Git 条目才触发真正历史对比
很多人误以为 Timeline 是“时间线快照”,其实它只是聚合视图入口。真正触发 diff 的动作是:在 Timeline 中点击某条 Git 提交记录,右侧才会自动打开 Compare with Previous 视图——也就是当前文件 vs 上一版 commit 的精确差异。
右键某条记录选“还原更改”,仅对工作区未暂存的修改有效;若已 git add,该选项会灰掉。Timeline 不显示跨文件关联变更,也不支持按分支聚合,这类需求仍得回到 Source Control 面板手动操作。
- Timeline 里 Git 条目依赖本地仓库状态:文件未纳入 Git 跟踪时,只显示文件系统修改时间,不展示 commit 级 diff
- 点击某条 Git 记录后,VS Code 自动调用
git diff获取变更,因此必须确保 Git CLI 可用且配置正确 - Timeline 搜索框支持关键词过滤(作者名、提交信息片段),但无法按目录层级筛选,这是它和 Source Control 面板的本质区别











