Git worktree
概念
在日常开发中,我们如果需要切换分支开发的话,就会先提交当前分支的代码或者暂存起来,然后切换到目标分支进行开发。Git worktree允许你同时检出多个分支,每个分支在不同的文件夹,但它们共享同一个.git目录,从而便于管理多个分支的代码。
常用场景
- AI 驱动开发:在独立工作树中运行 AI 代理,以防止其覆盖本地未保存的更改。
- 紧急漏洞修复:在独立目录中处理关键问题,不会打断当前的进度。
- 并行代码审查:在本地检出和测试拉取及合并请求,而不影响现有环境、数据库状态或构建产物。
- 长时间运行的任务:在一个工作树中执行大量测试套件或复杂构建,同时在另一个工作树中继续编写代码。
- 多分支环境切换:无需储藏更改,或者等待切换分支后大量文件的重新索引,即可管理多个长期分支。
场景举例:我正在开发一个功能,此时有紧急缺陷需要修复

此时我们需要从main分支切一个hotfix分支出来修复缺陷。
操作步骤
bash
git worktree add ../worktree-practice-hotfix -b hotfix/main main命令解释:
../worktree-practice-hotfix:新工作树的路径,会放在当前仓库目录的同级目录下(当然你也可以指定其他绝对路径)。-b hotfix/main:在新工作树中创建并切换到名为hotfix/main的新分支。main:新分支的起点(基于main分支的当前提交)。
执行之后,会在 ../worktree-practice-hotfix 目录下创建一个新的工作树,该工作树共享当前仓库的 .git 目录,但是有自己独立的目录结构和文件。hotfix/main 分支的代码会检检出到 ../worktree-practice-hotfix 目录下。

我们可以看到,这个“工作副本”是一个物理上独立的文件夹,内容和当前仓库的代码是独立的,互不干扰。 
我们注意到里面有一个.git文件:
.git文件内容
text
gitdir: /Users/zhuweicong/github_project/workstree-practice/.git/worktrees/worktree-practice-hotfix与主仓库.git(是一个目录)不同,该.git文件是描述了其关联的主仓库的绝对路径。
重点来了:此时,我们可以在../worktree-practice-hotfix目录下进行开发(例如:修复缺陷),而不会影响到仓库的其他分支。
Git clone VS Git worktree
| 维度 | git clone | git worktree |
|---|---|---|
| 工作方式 | 每次 clone 一个全新的完整仓库副本(含 .git 目录和历史) | 共享同一个主仓库的 .git 和历史,仅为每个分支创建一个独立的工作目录 |
| 磁盘占用 | 每个 clone 都是完整副本,多次 clone 占用 N × 仓库大小 | 主仓库一份,每个 worktree 仅占用工作区文件大小(不含 .git 历史),大幅节省空间 |
| 创建速度 | 慢,需要拉取全部历史、对象和文件 | 快,只需创建工作区文件即可,几乎瞬间完成 |
| 分支共享 | 各 clone 之间互不相干,无法直接感知彼此分支 | 同一仓库的所有 worktree 共享引用、stash、config,git branch 能看到所有分支 |
| 同时操作多分支 | 需要打开多个终端/IDE,频繁 cd 切换 | 每个 worktree 一个目录,可同时在不同目录中开发不同分支,无需来回切换 |
| 网络依赖 | 需要网络拉取(除非已有本地 bare repo) | 纯本地操作,无需网络 |
| 同步与一致性 | 需要手动 git remote 管理,每个 clone 独立 fetch/push | 所有 worktree 共用 .git,fetch/push 一次生效所有 worktree |
| 依赖管理风险 | 各自 node_modules 独立,互不影响 | 各 worktree 的 node_modules 也需各自安装,但共享同一 .gitignore |
| 删除/清理 | 直接 rm -rf 整个目录即可 | 使用 git worktree remove 清理,会自动清理元数据 |
| 学习成本 | 低,git 基础操作 | 中,需要理解 worktree 的概念和命令 |
场景选择建议
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| CI/CD 流水线构建 | git clone | 隔离环境,每次构建干净独立,避免交叉污染 |
| 本地同时开发多个功能分支 | git worktree | 无需切换分支,同一时间在多个目录分别开发 feature/bugfix |
| 紧急修复线上 bug(开发中切出去) | git worktree | 不打断当前的开发分支,快速创建 worktree 修复并提交 |
| 临时查看/对比其他分支的代码 | git worktree | 秒级创建,用完即删,不影响主工作区 |
| 代码审查(Code Review) | git worktree | 将 PR 分支拉到独立目录查看,不影响当前开发分支 |
| 不同机器/环境之间搬运代码 | git clone | worktree 依赖同一个主仓库,不适合跨机使用 |
| 新手学习 git | git clone | 心智模型简单,社区资料丰富 |
| 磁盘空间紧张 | git worktree | 大量节省存储空间 |
| 长期维护多版本(如 v1 / v2) | git clone | 版本差异大时隔离更安全,避免 worktree 路径依赖问题 |