必须先切换到目标分支,否则“merge from”无效;正确路径为源代码管理视图→merge branch或状态栏分支名右键→merge from;三栏编辑器需满足.git存在、git.mergeeditor启用、文件为纯文本且处于unmerged paths状态;accept both changes仅拼接代码,关键融合须手动编辑并git add后commit。

VSCode合并分支前必须切换到目标分支
点“Merge from”没反应?不是功能坏了,是你当前不在目标分支上。VSCode 的 git merge 语义是「在当前分支上合入另一个分支」,UI 不显式标出 base/head,导致大量人右键 feature/login → Merge from,却卡在 feature/login 分支上白忙活。
- 先点击状态栏分支名(如
feature/login),从弹出菜单选Checkout to main—— 注意是Checkout to,不是Merge from - 确认状态栏显示为
main后,再右键feature/login→Merge from - 若当前有未提交修改,VSCode 会静默阻止切换:要么
git stash,要么先git add && git commit,别硬切 - 合并前建议手动执行
git fetch(或点右上角同步按钮),否则远程分支列表可能滞后,origin/main还是旧 HEAD
冲突文件打不开三栏合并编辑器?检查这四个硬条件
The merge editor is not available 不是 bug,是 VSCode 明确告诉你上下文不满足启动条件。常见原因就四个,缺一不可:
-
.git必须存在且 VSCode 打开的是仓库根目录(状态栏能看到分支名) - 设置中
git.mergeEditor必须为true(旧版默认false,需手动开启) - 文件必须是纯文本,不能是二进制、图片、LFS 文件,也不能含 GBK 编码中文注释(但文件声明为 UTF-8)
- 该文件必须真实处于
Unmerged paths状态:终端运行git status,它得列在 “Unmerged paths” 下,而不是普通 “modified”
Accept Current Change 和 Accept Incoming Change 到底信哪边?
按钮文字看着像对称操作,实际指向完全相反的代码版本——而且 VSCode 不提示哪边是 HEAD、哪边是 incoming,全靠你脑内还原 Git 上下文。
-
Accept Current Change= 保留你当前所在分支的代码(即目标分支,比如main) -
Accept Incoming Change= 接收要被合入的分支代码(即源分支,比如feature/login) - 光标没进冲突块时,顶部按钮不浮现;用键盘导航容易错过,建议直接按
Ctrl+Shift+P→ 输入Git: Open Merge Editor强制唤出三栏界面 -
Accept Both Changes只是上下拼接,不做逻辑校验:两边都写了import axios?拼完直接报错;两边都改了config.timeout?中间区出现两行赋值,后者覆盖前者
冲突解决后保存 ≠ 合并完成,漏掉这步就卡在 MERGE_CONFLICT
很多人点完 Accept、保存文件、关掉编辑器,以为万事大吉——结果 git status 还显示 Unmerged paths,源代码管理视图里文件一直挂着红感叹号。
- VSCode 在冲突块里点按钮 + 保存文件,只触发
git add,标记该文件为已解决,**不是提交** - 多个冲突文件全部处理完后,必须手动在源代码管理视图中点击每个文件旁的
+号(或终端执行git add <file></file>) - 最后还得点一次
Commit Merge按钮(或git commit),否则合并流程根本没结束,连本地 commit 都没生成 - 特别注意:
Git: Accept All Current Changes一键处理整个文件所有冲突块后,VSCode **不会自动 git add**,仍需手动操作











