必须打开工作树目录本身,vscode才能识别git状态;若打开父目录或主仓库根目录则无效,因vscode不自动扫描子目录下的工作树,且需确认该目录下存在指向主仓库的.git文件(非文件夹),内容如“gitdir: /path/to/repo/.git/worktrees/feature-auth”。

必须打开工作树目录本身,VSCode 才能识别 Git 状态并启用完整功能;打开父目录或主仓库根目录无效。
VSCode 打不开工作树的 Git 状态(灰掉 / “No source control providers”)
常见错误现象是源代码管理视图不可用、状态栏不显示分支、集成终端执行 git status 报错 fatal: not a git repository。根本原因只有一个:VSCode 没有“真正打开”工作树目录。
- 确认你用的是
File → Open Folder…(不是拖入、不是双击、不是从最近项目列表点开),且路径精确指向工作树所在文件夹,例如/path/to/repo-feature-auth - 检查该目录下是否存在
.git文件(注意:是文件,不是文件夹),内容应为类似gitdir: /path/to/repo/.git/worktrees/feature-auth - 不要打开
/path/to/repo(主仓库根目录)或其父级目录——VSCode 不会自动扫描子目录下的工作树 - 如果用了 GitLens,进设置搜
multi-worktree,确保gitlens.gitExplorer.multiWorktreeSupport为true
git worktree add 时漏掉 -b 导致分支没建好
加不加 -b 决定的是“检出已有分支”还是“新建本地分支”,混淆会直接导致后续 push 失败、远程追踪丢失、git branch 里找不到分支。
- 想基于远程分支(如
origin/feature/login)拉取并检出同名本地分支 → 不加-b:git worktree add ../feature-login feature/login - 想新建一个本地分支(比如
feature/new-ui)并立即在新目录中检出 → 必须加-b:git worktree add -b feature/new-ui ../feature-new-ui main - 漏掉
-b后,git branch看不到该分支,git push会提示no upstream configured,需补一句git push -u origin feature/new-ui
多个 VSCode 窗口并行运行不同工作树的隔离边界
每个工作树在 VSCode 中是完全独立的进程上下文:独立的 node_modules、独立的 package.json 修改、独立的终端环境变量、独立的调试断点配置。
- 你在
feature/auth窗口执行npm install,不会影响hotfix/login窗口的依赖状态 - 两个窗口可同时运行
npm run dev和npm test,它们分别基于各自分支的代码快照,互不污染 - 状态栏右下角明确显示当前分支 + 工作树路径,例如
feature/auth | /path/to/repo-feature-auth - GitLens 的
asynchasWorkingChanges()方法会按工作树单独检查未提交更改,不会跨目录误判
删除工作树前必须清理干净
git worktree remove 默认拒绝删除含未提交更改或未推送提交的工作树,这是保护机制,不是 bug。
- 执行前先在该工作树目录中运行
git status,确认无modified、untracked或unstaged文件 - 若有未推送提交,先
git push origin <branch></branch>;若不想推,至少git commit掉再删 - 强制删除(绕过检查)仅用于极端情况:
git worktree remove --force ../feature-login,但可能丢失未保存的编辑状态 - 删除后,VSCode 对应窗口不会自动关闭,需手动关;重新打开原路径也不会恢复 Git 上下文
最常被忽略的一点是:工作树的 .git 是一个指向主仓库的符号链接式文件,不是副本。一旦误删主仓库的 .git/worktrees/xxx 目录,所有关联工作树都会失效,且 VSCode 无法自动修复——它只读物理路径,不反向校验主仓库完整性。











