vscode 1.80+ 原生支持 git: compare branches 命令,但仅支持当前分支与目标分支的单向对比(等价于 git diff head target-branch),结果以侧边栏列出差异文件并支持并排 diff 视图;如需严格控制基准(如三点语法、路径限定或忽略空格),应使用 git diff 生成 patch 后在 vscode 中打开;gitlens 可通过先检出基准分支再右键对比实现任意两分支比较,但不支持直接输入双分支名。

直接用 VSCode 内置命令对比两个分支
VSCode 1.80+ 版本已原生支持 Git: Compare Branches 命令,无需插件即可完成基础分支对比。但要注意:它只比较「当前检出分支」与你指定的另一个分支,不是任意两分支对称差。
操作路径是:Ctrl+Shift+P(Windows/Linux)或 Cmd+Shift+P(macOS)→ 输入 Git: Compare Branches → 回车 → 输入目标分支名(如 main)。
- 结果以侧边栏列出所有差异文件,图标标注
✎(修改)、⊕(新增)、⊗(删除) - 点击任一文件,打开并排 diff 视图,支持语法高亮、行级折叠、点击跳转原文件
- ⚠️ 容易踩的坑:
Compare Branches实际执行的是git diff HEAD target-branch,如果你当前在dev分支,却想看main相对于feature/login的改动,这个命令会反向——它永远以当前分支为“基准”
用 git diff + VSCode 打开 patch 文件(最可控)
当你要严格控制对比逻辑(比如三点语法、忽略空格、限定路径),或者当前分支不是你想要的基准时,命令行生成 patch 是唯一可靠方式。
在项目根目录终端运行:
git diff main feature/login > diff.patch
然后按 Ctrl+P → 输入 diff.patch → 选择该文件 → VSCode 自动以 diff 模式渲染。
-
git diff a b是两路 diff(a 到 b 的变更),git diff a...b(三点)才是从共同祖先出发的净变更,更接近“真正差异” - 加
--ignore-space-change或-w可忽略空格变化;加--name-only先快速确认影响范围 - Windows 用户注意:
>重定向默认用 CRLF,可能干扰 diff 渲染;建议用git config --global core.autocrlf false临时规避
用 GitLens 扩展对比非当前分支(唯一真·双向支持)
GitLens 的 Compare With Branch 功能是目前唯一能让你不切换分支就对比任意两个分支(如 main vs release/v2.3)的方案,但它有硬性前提:必须先手动检出其中一个作为当前分支。
操作流程:
- 右键左侧 GitLens 的
Branches视图 →Checkout你想设为“基准”的分支(比如main) - 再右键目标分支(如
release/v2.3)→Compare With Current Branch - 它会列出所有差异文件,并支持双击逐个打开对比
- ⚠️ 容易踩的坑:GitLens 不支持直接输入两个分支名对比;它背后仍是
git diff HEAD target,只是 UI 封装得更友好
为什么不能用“Compare Files”选两个分支?
因为 Compare Files 是文件级功能,而分支是 Git 提交引用。VSCode 原生不解析 main:src/index.ts 这类 ref:path 语法。
有人试过用 git show main:src/index.ts > main-index.ts 和 git show dev:src/index.ts > dev-index.ts 生成两个临时文件再对比——技术上可行,但:
- 丢失 Git 元信息:submodule 状态、line-ending 设置、binary 标记全失效
- 无法体现重命名/移动:如果文件在某个分支被
git mv过,git show会失败或返回空 - 每次都要手动生成、清理临时文件,不适合批量或自动化场景
真正要对比两个分支的“完整语义差异”,只能靠 git diff 系列命令驱动,VSCode 只负责可视化呈现。别指望 UI 点几下就能绕过 Git 的底层模型。











