vscode 中可通过右键选中代码块后选择“stage selected ranges”实现类似 git add -p 的部分暂存,需在差异视图中鼠标拖选跨hunk的增改行,或通过命令面板执行该命令;不支持纯删除行或半行选择,依赖 git 2.30+。

VSCode 里怎么用鼠标选中部分代码来 git add -p
VSCode 原生不支持像命令行 git add -p 那样交互式地逐块暂存,但内置的“源代码管理”视图 + 右键菜单可以做到「只暂存当前文件中被选中的代码块」——前提是开启 git.enableSmartCommit 并使用「Stage Selected Ranges」功能。
这个操作不是靠快捷键触发,而是依赖鼠标精确选中、再右键调出上下文菜单。很多人找不到入口,是因为默认没打开「差异编辑器」或没注意右键位置。
- 确保你已打开一个有未提交修改的文件,且该文件在左侧源代码管理面板中显示为「已修改」
- 点击文件名进入内联差异视图(就是左右对比那个界面),或者直接在编辑器里打开该文件并确保光标在改动区域
- 用鼠标拖选某几行「新增/修改的代码」(必须包含至少一行
+行,不能只选空白或未改动行) - 右键 → 选择 Stage Selected Ranges(不是「Stage Changes」)
为什么选中后右键没看到 Stage Selected Ranges
这个选项是条件性出现的:只有当 VSCode 检测到你选中的范围跨越了 Git 差异块(hunk),且该范围确实对应一部分可独立暂存的变更时,才会显示。常见失效原因:
- 你选的是纯删除行(
-行),VSCode 不允许单独暂存删除,必须配合新增一起选,或改用命令面板 - 选区跨了两个不连续的 hunk(比如跳着选了第3行和第15行),VSCode 认为这不是一个逻辑块,隐藏该菜单项
- 工作区启用了 WSL 或远程开发,但本地 Git 配置未正确挂载,导致差异解析失败
-
git.suggestSmartCommit被设为false(虽然不影响功能,但可能干扰 UI 逻辑)
替代方案:命令面板里手动触发(更稳定)
当右键菜单不出现或选区太零碎时,绕过 UI 判断,直接走命令通道更可靠。它不依赖选区是否“合规”,只要光标在改动行内就能生效。
- 按
Ctrl+Shift+P(Windows/Linux)或Cmd+Shift+P(macOS)打开命令面板 - 输入并选择
Git: Stage Selected Ranges - 此时光标所在行如果属于某个 hunk,VSCode 会把整个 hunk 当作候选;若已选中多行,则仅作用于选区
- 注意:如果当前文件没有任何 Git 差异(比如刚新建未跟踪),该命令会静默失败,无提示
Stage Selected Ranges 的实际行为边界
它不是“把选中的代码变成新 patch 然后 add”,而是从 Git 底层提取出对应 hunk 的原始 diff 片段,再调用 git apply --cached 把这部分打到暂存区。这意味着:
- 无法暂存「半行修改」——比如只选中某一行里的几个字符,VSCode 会自动扩展到整行
- 如果选中内容横跨「修改前」和「修改后」两行(比如同时选中
-old()和+new()),它只会暂存+new()这一侧,删除操作仍留在工作区 - 暂存后,未选中的改动依然保留在编辑器中,但源代码管理面板里该文件会拆成两部分:已暂存(绿色)、未暂存(黄色)
- 该功能依赖 Git 2.30+,旧版 VSCode(
真正容易被忽略的是:一旦你对同一个文件反复做部分暂存,后续再想撤销某一块,不能只用 git restore --staged <file></file>,得进命令行用 git restore -p --staged <file></file> 才能挑着撤。VSCode 的「Undo Stage」按钮只针对整个文件。











