Git -> Git Worktree 工作树

Git Worktree 完全指南

什么是 Git Worktree

Git WorktreeGit 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
相关推荐
峥无11 小时前
C++11 深度详解:现代 C++ 基石全梳理
开发语言·c++·笔记
阿米亚波11 小时前
【C++ STL】std::unordered_multimap
开发语言·数据结构·c++·笔记·stl
gwf21611 小时前
SSD读写速度深度解析:顺序读写vs随机读写、IOPS、延迟,你的硬盘性能到底怎么看?
git·嵌入式硬件·缓存·github·智能硬件
码农coding11 小时前
android12 systemUI 之锁屏
android
SomeB1oody11 小时前
【RustyML入门】1.0. 快速上手
开发语言·后端·机器学习·rust·教程
圆山猫11 小时前
[Virtualization](三):RISC-V H-extension 与 Guest 执行模式
android·java·risc-v
狗凯之家源码网11 小时前
短剧系统搭建实战:源码功能与商业变现效果全景展示
开发语言·php
爱笑鱼12 小时前
Binder(七):getCallingUid() 读到的是谁?clearCallingIdentity() 又清掉了什么?
android
西邮彭于晏12 小时前
图文详解:Git分支创建、合并与冲突解决|新手零门槛完整教程
大数据·git·elasticsearch
易筋紫容13 小时前
创建型模式:对象的诞生艺术
开发语言·前端·javascript