Skip to content

工作树(Worktree)

git worktree 允许你同时在多个分支上工作,每个分支有独立的工作目录,共享同一个 .git 仓库。

git worktree add 创建工作树

bash
# 在新目录创建工作树,检出指定分支
git worktree add ../hotfix hotfix/urgent-bug

# 创建工作树并同时创建新分支
git worktree add -b feature/new-feature ../feature-work main

# 基于某个提交创建(分离 HEAD 状态)
git worktree add ../review abc123

同时在多个分支上工作

工作树解决了"需要切换分支时,当前工作区有未提交改动"的问题:

bash
# 场景:正在 feature 分支上开发,需要紧急修复 bug
# 传统方式:stash → switch → 修复 → push → unstash(繁琐)

# 使用 worktree:
# 为 hotfix 创建独立工作目录
git worktree add ../hotfix-work hotfix/urgent-bug

# 在新终端或文件管理器打开 ../hotfix-work,不影响当前工作
cd ../hotfix-work
# 修复 bug,提交,推送
git commit -m "fix: 紧急修复"
git push

# 回到原来的工作目录继续开发
cd ../my-project
# 工作区状态完全保留!

git worktree list / remove

bash
# 查看所有工作树
git worktree list
# /home/user/my-project       abc123 [main]
# /home/user/hotfix-work      def456 [hotfix/urgent-bug]
# /home/user/feature-work     ghi789 [feature/new-feature]

# 详细信息
git worktree list --porcelain

# 删除工作树
git worktree remove ../hotfix-work

# 强制删除(有未提交改动时)
git worktree remove --force ../hotfix-work

# 清理已删除目录的引用
git worktree prune

使用场景:紧急修复时不想 stash

这是 worktree 最典型的使用场景:

bash
# 正在进行复杂的功能开发,工作区有大量未提交改动
git status
# On branch feature/complex-refactoring
# Changes not staged for commit: (大量文件)

# 收到紧急修复请求,不想 stash(可能有冲突)
# 创建独立的 hotfix 工作树
git worktree add ../urgent-fix -b hotfix/login-crash main

# 在新目录修复(完全独立,不影响 feature 工作区)
cd ../urgent-fix
# 修复...
git commit -m "fix: 修复登录崩溃问题"
git push

# 修复完成,删除 hotfix 工作树
git worktree remove ../urgent-fix

# 回到原来的工作,毫无影响
cd ../my-project
git status  # 工作区状态完整保留

注意事项

  • 同一个分支只能在一个工作树中检出,不能在两个工作树同时检出同一分支
  • 工作树之间共享 .git 目录(对象存储、引用等)
  • 每个工作树有独立的暂存区(INDEX)
  • 适合短期并行工作,不建议长期维护大量工作树

总结

操作命令
创建工作树git worktree add <path> <branch>
创建并切换新分支git worktree add -b <branch> <path>
查看所有工作树git worktree list
删除工作树git worktree remove <path>
清理引用git worktree prune

Worktree 是处理并行开发任务的优雅方案,特别适合"不想 stash,又不想放弃当前工作"的场景。