需要同时维护 main 和 feature-login 两条分支时,不必把未提交文件先藏进 stash 再切换分支。Git worktree 可以让同一个仓库拥有多个工作目录,每个目录独立检出一个分支;开发工具再把这些目录作为多个仓库入口展示。
本文用一个主工作区和一个功能 worktree 演示完整操作:创建、分别打开、比较改动、迁移未提交文件,以及最后清理临时目录。Git 共享提交历史,但每个 worktree 有自己的文件、暂存区和当前分支。
官方入口:https://code.visualstudio.com/docs/sourcecontrol/branches-worktrees
Git 命令参考:https://git-scm.com/docs/git-worktree.html
一、先判断是否应该使用 Git worktree
如果只是短暂切换分支,普通分支切换或 stash 已经够用;如果当前目录有一组未提交改动,同时又要修复另一条分支,worktree 更合适。它把两条分支放进不同文件夹,避免反复切换同一目录里的文件。
| 需求 | 更合适的方式 | 原因 |
|---|---|---|
| 临时收起少量未提交文件 | stash | 不需要长期保留第二个目录 |
| 两个分支同时运行或对比 | worktree | 每个分支有独立工作目录和暂存区 |
| 把功能提交合并回主线 | 分支合并 | 提交历史仍然共享,不靠复制文件合并 |
打开开发工具后,先从源代码管理视图进入 Repositories。仓库名称、当前分支和工作区状态都能在这里确认。开发工具需要单独安装 Git,内置的是 Git 集成而不是 Git 本身。
二、在开发工具中创建第二个 worktree
创建入口通常位于 Source Control 的 Repositories 视图。针对目标仓库打开 More Actions(更多操作),选择 Worktrees > Create Worktree。
- 选择一个已有分支,例如
feature-login;如果分支还不存在,按提示创建新分支。 - 选择新的文件夹,例如仓库同级目录下的
project-feature-login,不要覆盖当前主工作区。 - 确认创建,让工具在新目录检出选定分支。
创建完成后,Repositories 视图应同时出现主工作区和新的 linked worktree。Git 不允许同一个本地分支同时被两个 worktree 检出,因此如果提示分支已被占用,应改选其他分支或先确认已有 worktree 的用途。
三、分别打开两个工作目录
右键新 worktree,可以选择 Open Worktree in New Window;也可以使用 File > Open Folder 直接打开它的文件夹。建议主分支和功能分支各保留一个窗口,并在窗口标题或状态栏确认分支名。
两个 worktree 共享仓库的提交历史、分支和远程地址,但不共享工作文件和未提交状态。因此,在 feature-login 窗口编辑文件时,main 窗口不会同步显示这份未提交改动。这个隔离正是 worktree 适合并行开发的原因。
被 .gitignore 排除的本地文件(例如环境文件或依赖目录)默认不会复制到新 worktree。需要共享这些文件时,可以在设置中配置 git.worktreeIncludeFiles;需要用符号链接共享大型目录时,可以了解实验性的 git.worktreeSymlinkFolders,但要注意一个 worktree 中的修改会影响其他链接目录。
四、比较改动并迁移未提交文件
在功能 worktree 中产生改动后,先在 Source Control 的变更文件上打开上下文菜单,选择 Compare with Workspace,查看它与主工作区的差异。这个比较动作只帮助确认差异,不会自动提交或合并。
如果确定要把未提交改动移回主工作区,打开命令面板,运行 Git: Migrate Worktree Changes...,按提示选择目标仓库和来源 worktree,确认 Proceed。迁移的是未提交改动,包括未跟踪文件;它不会把已经提交的内容当成未提交文件迁移。
如果迁移提示目标目录也有本地改动,先在目标 worktree 提交或暂存这些改动,再重新操作。如果出现冲突,按普通合并冲突流程解决,确认目标目录的文件内容后再提交。
五、用命令行确认状态并安全清理
界面入口适合日常操作,命令行适合在清理前快速确认路径。下面的命令只用于示例,路径请替换成自己的 worktree 目录:
# 查看主工作区和所有 linked worktree 的路径、分支与状态
git worktree list
# 删除一个已经提交或保持干净的 linked worktree
# 先确认路径确实指向不再使用的功能目录
git worktree remove ../project-feature-login
# 目录被文件管理器手动删除后,清理 Git 中残留的管理信息
git worktree prune
git worktree remove 默认只删除干净的 linked worktree;如果目录还有未提交或未跟踪文件,先处理这些文件,再考虑清理。主工作区不能用这个命令删除。不要把 git worktree prune 当成普通删除命令,它主要处理已经失去目录对应关系的陈旧管理信息。
常见问题
为什么新 worktree 里没有 .env 或依赖目录?
这些内容通常被 .gitignore 排除,Git 默认不会复制。可以为安全的本地文件配置 git.worktreeIncludeFiles,但不要把密钥、令牌或个人凭据加入共享配置。
为什么同一个分支不能再次创建 worktree?
一个本地分支同一时间只能被一个 worktree 检出,这是 Git 用来避免两个目录同时写同一分支指针的保护。为第二个目录创建新分支,或先移除原有 worktree。
迁移改动后,提交历史会一起移动吗?
不会。Migrate Worktree Changes 处理的是未提交文件;已经提交的内容应通过分支合并或其他正常 Git 历史操作带回目标分支。
最后确认
并行分支的关键不是复制一份项目,而是让多个工作目录挂在同一份 Git 历史上。创建后确认每个窗口的分支名,比较前先看目标目录是否有本地改动,清理前用 git worktree list 核对路径,就能把 worktree 用在并行修复、功能开发和分支对比上。

开发工具 Compose 等待依赖健康 怎样处理
