Git 内置命令 —— 同一仓库挂载多个工作目录,实现多分支并行开发,无需 stash 或切换分支。

为什么值得关注

传统工作流切换分支前必须 stash 或提交,worktree 允许同时 checkout 多个分支到不同目录,互不干扰。适合:同时修复 hotfix 和开发新功能、并行运行测试、隔离实验性改动。

语法

git worktree add    [-f] [--detach] [-b <branch>] <path> [<commit-ish>]
git worktree list   [-v | --porcelain]
git worktree lock   [--reason <string>] <worktree>
git worktree move   <worktree> <new-path>
git worktree prune  [-n] [-v] [--expire <expire>]
git worktree remove [-f] <worktree>
git worktree repair [<path>...]
git worktree unlock <worktree>

子命令

子命令说明
add创建新 worktree,checkout 指定分支或提交
list列出所有 worktree(主 + 链接)
lock锁定 worktree,防止被 prune/move/delete
unlock解锁 worktree
move移动 worktree 到新路径
remove删除 worktree(仅干净状态,否则加 -f)
prune清理 $GIT_DIR/worktrees 中的过期元数据
repair修复因手动移动导致的路径关联损坏

常用选项(add)

选项说明
-b <branch>创建新分支并 checkout
-B <branch>强制创建/重置分支
-d / --detach以 detached HEAD 方式 checkout
--no-checkout创建 worktree 但不 checkout(用于 sparse-checkout 等定制)
-f / --force强制创建(分支已被其他 worktree 使用时)
--lock创建后立即锁定

常用示例

# 基于当前 HEAD 创建新 worktree(自动创建同名分支)
git worktree add ../hotfix
 
# 在新 worktree 中创建并 checkout 新分支
git worktree add -b feature/login ../feature-login
 
# checkout 已有分支到新目录
git worktree add ../release-1.0 release/1.0
 
# 以 detached HEAD 方式创建(临时实验)
git worktree add -d ../experiment
 
# 列出所有 worktree
git worktree list
 
# 删除 worktree
git worktree remove ../hotfix
 
# 强制删除有未提交改动的 worktree
git worktree remove -f ../hotfix
 
# 清理已手动删除目录的残留元数据
git worktree prune

工作原理

  • 主 worktree 由 git init / git clone 创建,元数据在 .git/
  • 链接 worktree 的元数据存储在 .git/worktrees/<name>/,包含独立的 HEAD、index
  • 同一仓库的所有 worktree 共享 objects、refs(除 per-worktree 文件外)
  • 同一分支不能同时被两个 worktree checkout(除非 --force)

适用场景

  • 并行开发:同时在 main 修 bug、在 feature 开发新功能
  • Code Review:checkout PR 分支到独立目录,不影响当前工作
  • 长时间构建/测试:在另一个 worktree 跑测试,当前目录继续编码
  • AI Agent 隔离:为每个 Agent 任务创建独立 worktree,避免互相干扰

局限性

  • 同一分支不能被多个 worktree 同时 checkout
  • 主 worktree 不能被 remove 或 move(含 submodule 的 linked worktree 也不能 move)
  • 手动删除 worktree 目录后需运行 prune 清理元数据

相关命令

  • git branch — 分支管理
  • git stash — 临时保存工作区(worktree 的替代方案之一)
  • git checkout / git switch — 单 worktree 下的分支切换
  • git-revert — 撤销提交,不改写历史