版本控制

用 git worktree 并行开发多个分支与任务

面向需要同时盯多个分支、频繁切换又担心 stash 乱套的开发者,教你一个干净工作目录对应一个任务的并行开发法。

作者:巧匠团队·6 分钟阅读·更新于 2026-09-06

为什么频繁 git stash + checkout 会把人搞糊涂

一次一个工作目录时,切分支前要 stash、切回要 stash pop,几次下来容易混:pop 冲突、“这堆改动属于哪个分支”成谜、忘了 stash 导致白丢半天活。

git worktree 让同一个仓库能同时有几个物理独立的工作目录,每个目录绑定一个分支。你在 A 目录改 feature-A,在 B 目录改 bugfix-B,互不打扰,无需 stash。

适用前提:分支间不共用会在运行时冲突的本地文件(如 node_modules、.env)。依赖各自安装一次,推荐把依赖目录放仓库外或用缓存共享,避免每个 worktree 都跑一遍安装。

# 在仓库根目录下新建一个绑定分支的额外工作树
git worktree add ../feature-a -b feature-a

# 再建一个跟踪已有分支的 worktree
git worktree add ../hotfix -b hotfix origin/main

git worktree list
# /repo                12ab main
# /repo/../feature-a  34cd feature-a
# /repo/../hotfix     56ef hotfix

按任务建 worktree:一个干净目录对应一段清晰历史

核心习惯:每个进行中的任务(功能、Bug、实验)对应一个独立 worktree 和一个专用分支。目录名就用任务代号,比如 ../feat/pricing-table、../fix/timezone。

这个模型让你无需记住当前在哪个分支上——你人在哪个目录就清楚。也能同时给同一基准起多个分支做对比:同基于 origin/main 开 A 和 B 两个 worktree,改完分别在目录里测试,互不覆盖。

提交 / 测试 / lint 在各 worktree 独立进行,CI 的并行也是自然的:每个目录自己起服务、跑测试,不再担心端口或文件锁。

base="origin/main"

git worktree add ../feat/pricing-table -b feat/pricing-table "$base"
git worktree add ../fix/timezone    -b fix/timezone    "$base"

# 各自独立开发
# (cd ../feat/pricing-table && pnpm install && pnpm dev)
# (cd ../fix/timezone && pnpm install && pnpm test)

git worktree list

错误示范:忘了同一分支只能有一个工作目录

一个分支通常只能被一个 worktree 绑定。你试着让两个目录都 checkout main 会失败,报 “already checked out at”。这是保护,不是错误,看提示确认是哪个目录。

如果确实需要,在第二个 worktree 用 git checkout --detach 进入游离头,但正常开发别这么做。

清理时用 git worktree remove <path>(旧版本先 git worktree prune 清空失效记录),从 Git 与磁盘同时移除。

# 错误示范:同一分支开两个目录
git worktree add ../dup main
# fatal: 'main' is already checked out at '<other-dir>'

# 正确清理
git worktree remove ../dup

# 或只移除注册信息(目录你手动删过)
git worktree prune

git worktree list

验证多 worktree 状态清爽无脏指针

完成任务删除前,先确认该 worktree 里没有未提交改动。git worktree list --porcelain 可以脚本化拿到每个目录的路径与分支。

用独立目录并行时就别再靠猜分支:在跑脚本时显式 cd 到对应目录,避免误在错误的 worktree 上操作。

收尾习惯:每个分支 push 掉后删除 worktree,让 list 保持精简,避免堆积一堆已合并的分支占住磁盘。

# 脚本化查看所有 worktree(--porcelain 输出易解析)
git worktree list --porcelain
# worktree /repo
# branch refs/heads/main
# worktree /repo/../feat/a
# branch refs/heads/feat/a

# 回收完的分支对应目录
git worktree remove ../feat/a

git worktree prune

git worktree list

官方参考来源

下方为命令对应的官方权威文档,供你核对最新用法与深入查阅。