vscode git面板“+”按钮仅强制添加未跟踪文件,非git add -a;暂存修改需右键“stage changes”或执行git: stage all;冲突文件需手动打开才显示解决按钮;“accept current change”保留本地修改,“accept incoming change”采用远端改动。

VSCode 的 Git 面板能完成绝大多数日常操作,但默认行为和界面反馈常让人误判状态——比如点“+”没暂存修改、冲突文件不显示、点了“Accept”却丢掉了关键逻辑。核心不是功能缺失,而是 VSCode 对 Git 状态的映射有延迟、有前提、有边界。
点“+”按钮为什么没暂存修改?
VSCode 源代码管理面板顶部的“+”按钮,**只添加未跟踪(untracked)文件**,不是 git add -A,也不处理已修改但未暂存的文件(modified)、已删除文件(deleted)或忽略文件(.gitignore 中的)。
- 你改了
src/api.js,又新建了src/utils/date.js,点“+”后只有date.js进暂存区,api.js仍灰着——这是正常行为,不是 bug - 想暂存所有修改:右键单个文件选“Stage Changes”,或多选后右键 → “Stage Changes”,或按
Ctrl+Shift+P输入Git: Stage All - 如果希望“+”也包含修改文件,不能靠设置开关,得改工作流:先
git add -u或Git: Stage All,再用“+”补新文件
冲突文件在 SCM 面板里不显示?
VSCode 不会自动把 git status 输出的“both modified”实时同步到源代码管理面板。常见现象是终端报 conflict,但 SCM 面板仍只显示“Changes”,没有感叹号或“Merge Changes”区域。
- 先在终端运行
git status,确认具体冲突文件名(如package.json) - 手动在资源管理器中打开该文件(不要从 SCM 面板双击),编辑器底部状态栏才会出现“Accept Current Change / Accept Incoming Change”按钮
- 如果按钮没出来:关闭该文件所有标签页 → 重新从资源管理器打开 → 确保状态栏有提示
- 点击面板右上角刷新按钮(↻)或运行
Git: Refresh命令,仅在状态已同步的前提下才有效
“Accept Current Change”到底保留谁的代码?
这个按钮名称和视觉位置容易反直觉:左侧代码块标的是“Incoming Change”,右侧是“Current Change”,但 VSCode 默认把当前分支(如 main)内容放在右边,远端分支(如 origin/main)放在左边——所以“Current”是你本地的,“Incoming”是刚 pull 下来的远端改动。
- 点“Accept Current Change” = 保留你本地的修改,丢弃远端那部分
- 点“Accept Incoming Change” = 放弃你本地的,全用远端的——这在你刚 pull 就冲突时,可能直接覆盖掉自己几小时的改动
- 更安全的做法:点“Accept Both Changes”,然后手动删掉重复、冲突或无效的部分,尤其对 JSON 字段增删、配置项顺序敏感时
- 不确定时,看底部状态栏:它会明确标出
HEAD所在分支名(如main),那个分支的内容就是“Current”
怎么让 git mergetool 调起 VSCode 四窗格合并界面?
VSCode 内置的四窗格合并视图(BASE/LOCAL/REMOTE/MERGED)不是默认启用的,必须显式配置 Git 使用 code --wait --merge 作为 mergetool。
- 执行:
git config --global merge.tool vscode - 执行:
git config --global mergetool.vscode.cmd 'code --wait --merge $BASE $LOCAL $REMOTE $MERGED' - 确保
code命令可用:在终端运行code --version;若失败,进 VSCode 按Ctrl+Shift+P运行Shell Command: Install 'code' command in PATH,并重启终端 - 触发方式:发生冲突后,在终端运行
git mergetool(不是code .或手动打开文件);看到Hit return to start merge tool提示后再回车 - Windows Git Bash 用户注意:
$BASE可能被提前展开,需写成\$BASE
真正卡住人的往往不是功能不会用,而是 VSCode 和 Git 在状态同步、术语定义、触发条件上的细微错位——比如“+”不等于 add、“Current”在右边、“mergetool”要手动注册。多看一眼 git status 输出,比反复刷新面板管用得多。











