Git -> Git Worktree 工作树

Git Worktree 完全指南

什么是 Git Worktree

Git Worktree 是 Git 2.5+ 引入的功能,允许在同一仓库的不同目录中同时检出多个分支,每个目录都是独立的工作树。

复制代码
┌─────────────────────────────────────────────────────┐
│                   仓库 (repo)                       │
│                                                     │
│  ┌──────────────┐  ┌──────────────┐  ┌──────────┐ │
│  │ worktree-A   │  │ worktree-B   │  │ main     │ │
│  │ (fix-bug-1)  │  │ (feature-X)  │  │ (当前)   │ │
│  └──────────────┘  └──────────────┘  └──────────┘ │
└─────────────────────────────────────────────────────┘

核心概念

概念 说明
worktree 独立的工作目录,每个可以检出不同分支
bare repository 裸仓库(无工作目录)
linked worktree 关联到主仓库的工作树
main worktree 主工作树(.git 所在目录)

常用命令

1. 查看工作树列表

bash 复制代码
git worktree list

输出示例:

复制代码
/path/to/repo          abc1234 [main]
/path/to/repo/fix-A    def5678 [feature-A]
/path/to/repo/fix-B    ghi9012 [feature-B]

2. 创建工作树

bash 复制代码
# 基本语法
git worktree add <path> <branch>

# 示例:在 fix-C 目录检出 tOS_A17_trunk 分支
git worktree add fix-C tOS_A17_trunk

# 示例:基于远程分支创建
git worktree add fix-C origin/tOS_A17_trunk

# 示例:创建并切换到新分支
git worktree add -b fix-C tOS_A17_trunk

3. 删除工作树

bash 复制代码
# 安全删除(推荐)
git worktree remove fix-C

# 强制删除(如果有未保存的更改)
git worktree remove --force fix-C

4. 移动工作树

bash 复制代码
git worktree move fix-C new-location/

5. 锁定/解锁工作树

bash 复制代码
# 锁定(防止意外删除)
git worktree lock fix-C

# 解锁
git worktree unlock fix-C

6. 清理无效工作树

bash 复制代码
git worktree prune

使用场景

场景一:并行开发多个功能

复制代码
当前正在 main 分支开发,突然发现紧急 bug
bash 复制代码
# 不需要 stash 当前工作,直接开新工作树
git worktree add hotfix-urgent main
cd hotfix-urgent
# 修复 bug...
git commit -m "fix: 紧急修复"
cd ../main  # 回到原分支继续之前的工作

场景二:Code Review 时对比代码

bash 复制代码
# 可以在独立目录查看 PR 分支
git worktree add pr-review origin/pr/123

场景三:大型重构时保持分支独立

bash 复制代码
# 在独立工作树进行破坏性重构
git worktree add refactor-core develop
cd refactor-core
# 进行大规模重构...

场景四:在 Claude Code 中隔离实验

复制代码
┌─────────────────────────────────────────────────┐
│  tOS_A17_trunk (主分支 - 稳定工作区)              │
│    └── worktree: fix-C (Bug修复分支)             │
│    └── worktree: feature-Y (新功能)              │
└─────────────────────────────────────────────────┘

注意事项

⚠️ 同一分支只能被一个工作树使用

bash 复制代码
# 错误示例:main 已被其他工作树使用
git worktree add another-main main
# 报错:fatal: 'main' is already being used by worktree at '/path/to/main-worktree'

⚠️ 删除工作树不会删除分支

bash 复制代码
git worktree remove fix-C
# 分支 fix-C 仍然存在,只是关联解除
git branch -d fix-C  # 需要手动删除分支

⚠️ 工作树之间共享 .git

修改 .git 内容(如 config、hooks)会影响所有工作树。但工作目录是独立的。

⚠️ 锁定状态的工作树无法删除

bash 复制代码
git worktree remove fix-C
# 报错:fatal: cannot delete worktree 'fix-C' (locked)

# 需要先解锁
git worktree unlock fix-C

常见问题排查

问题 解决方案
fatal: 'xxx' is already being used 该分支已在其他工作树使用,换分支名
cannot delete worktree (locked) 先 git worktree unlock
invalid path 检查路径是否合法(无特殊字符)
工作树目录丢失 用 git worktree prune 清理

总结

Git Worktree 是保持工作区干净、提升并行效率的利器,特别适合:

  • 多任务并行开发
  • 需要频繁切换分支的场景
  • Claude Code 中隔离不同任务的工作区

快速命令参考

bash 复制代码
# 创建工作树
git worktree add <path> <branch>

# 查看列表
git worktree list

# 删除工作树
git worktree remove <path>

# 锁定/解锁
git worktree lock <path>
git worktree unlock <path>

# 清理无效工作树
git worktree prune
相关推荐
懂点Tech4 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
catchadmin5 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路6 小时前
go-grpc设计思想
开发语言·后端·golang
吹什么轩6 小时前
MySQL:数据类型
android·adb
酷炫码神6 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
Elastic 中国社区官方博客7 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1887 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
造火箭7 小时前
安卓不同类型自动化测试介绍
android
步行cgn8 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc
传奇开心果编程9 小时前
【Rust入门练中学】第5课:引用与借用
开发语言·rust·引用·编程语言理论·通用编程语言·借用