Skip to content

第 13 课:Git Worktree 并行开发实战

第三章:产品开发协作 | 第 13 课

课前思考

你有没有遇到过这种情况:正在做一个新功能的 PRD,突然线上出了紧急 Bug 需要立刻处理。你手头的工作还没做完,没法提交,切分支又会丢失未保存的上下文。

或者你的产品同时有 3 个需求在并行推进,你想在本地同时看到三个不同的代码版本,而不是来回切换分支。

Git Worktree 就是为这个场景设计的。它让你一个仓库同时签出多个分支到不同目录,互不干扰。PM 不需要自己操作,但理解它能帮你更好地与开发协作,也让你理解 Codex 桌面版的「工作树」功能。


一、什么是 Git Worktree

1.1 一句话解释

Git Worktree 允许你在同一个仓库中,把不同的分支同时签出到不同的文件夹。每个文件夹独立工作,互不干扰。

1.2 为什么需要它

没有 Worktree 时,你只有一个工作目录:

开发新功能 A 中...  →  紧急!线上 Bug  →  怎么办?
                        ├─ 提交一半的代码?(污染提交历史)
                        ├─ git stash?(可能丢失上下文)
                        └─ 复制一份仓库?(浪费磁盘,且不同步)

有 Worktree 之后:

~/project/
├── main/          ← worktree 1:主分支,修 Bug
├── feature-a/     ← worktree 2:开发新功能 A
└── feature-b/     ← worktree 3:开发新功能 B

三个目录,同一个 .git 仓库,分支互不干扰。


二、基本操作

2.1 创建 Worktree

bash
# 基于 main 分支创建一个新的 worktree,用于紧急 Bug 修复
git worktree add ../project-hotfix hotfix/login-crash

# 基于 main 创建一个新分支,同时切换到新 worktree
git worktree add -b feature/payment ../project-payment main

执行后,../project-hotfix 目录就出现了,里面是 hotfix/login-crash 分支的代码,可以直接开始工作。

2.2 查看所有 Worktree

bash
git worktree list

# 输出示例:
# /Users/pm/project           abc1234 [main]
# /Users/pm/project-hotfix    def5678 [hotfix/login-crash]
# /Users/pm/project-payment   ghi9012 [feature/payment]

第一列是路径,第二列是 commit,第三列是分支名。当前你在哪个目录,哪个前面就有 * 标记。

2.3 删除 Worktree

bash
# 先删除 worktree 记录
git worktree remove ../project-hotfix

# 如果目录还有未提交的改动,需要强制删除
git worktree remove --force ../project-hotfix

# 然后手动删除文件夹(可选)
rm -rf ../project-hotfix

2.4 清理已不存在的 Worktree 记录

如果手动删掉了文件夹但 Git 记录还在:

bash
git worktree prune

三、实战场景

场景 1:紧急 Bug 修复

最经典的使用场景。你正在 feature/redesign 分支上开发新首页,产品改了一半,代码乱糟糟的不想提交。

bash
# 不中断当前工作,直接开一个 worktree 修 Bug
git worktree add -b hotfix/crash ../project-hotfix main

# 在新目录里修 Bug → 测试 → 提交 → 推送
cd ../project-hotfix
# ... 修 Bug ...
git add . && git commit -m "fix: login crash"
git push origin hotfix/crash

# 切回原来的工作目录,继续开发新首页
cd ~/project

整个过程你的新首页开发完全没被打断——不需要 stash、不需要临时提交。

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

团队同时推进 3 个需求,你想在本地同时跑三个版本做对比测试:

bash
git worktree add ../project-feat-a feature/ai-search
git worktree add ../project-feat-b feature/payment
git worktree add ../project-feat-c feature/onboarding

# 开三个终端窗口,分别进入三个目录
# 可以同时编译、测试、对比

场景 3:Code Review 时快速切换

开发提了 PR,你想拉下来本地跑一下看看效果,但又不想切走当前分支:

bash
# 基于 PR 分支创建一个临时 worktree
git fetch origin pull/42/head:pr-42
git worktree add ../project-review pr-42

# 在 review 目录里编译运行,看完就删
cd ../project-review
# ... 运行、测试、查看代码 ...
cd ~/project
git worktree remove ../project-review

四、PM 需要知道什么

作为产品经理,你一般不需要自己执行这些命令。但理解 Worktree 让你在以下场景中更专业:

4.1 理解开发的工作方式

当你问开发「Bug 修到哪了」,他说「我开了个 worktree 在修,不影响主线」——你听得懂他在说什么。

4.2 理解 Codex 桌面版的「工作树」

第 13 课会讲到 Codex 桌面版的 Worktree 功能——每个 AI Agent 在隔离的 Git 副本中工作,互不干扰,只有你确认后才会合并到主分支。

Codex 的工作树就是 Git Worktree 的自动化版本:

传统方式              Codex 方式
PM 手动 git add     →  Codex 自动创建 worktree
开发在不同目录工作    →  AI Agent 在隔离副本中工作
手动合并到 main      →  确认后一键合并

4.3 避免常见的协作误会

开发说实际意思PM 理解
「我在另一个 worktree 上」我开了个独立目录在并行工作他的开发环境同时跑着多个分支
「我 prune 一下 worktree」清理已经不用的本地分支目录他在做本地环境清理
「这个 worktree 冲突了」两个分支改了同一个文件需要确认以哪个版本为准

五、注意事项

  1. 不能两个 Worktree 同时 checkout 同一个分支——Git 会阻止你。每个 worktree 必须是不同的分支

  2. Worktree 共享同一个 .git 目录——这意味着 fetch/push 对所有 worktree 生效,不需要在每个目录里重复拉取

  3. 用完记得清理——Worktree 会占用磁盘空间(每个目录都是完整的代码副本)。不用的 worktree 及时 remove + 删文件夹

  4. 默认分支不能是 detached HEAD——创建 worktree 时 Git 会检查主 worktree 的状态


本课实践

  1. 在你的项目里创建一个 worktree,体验「不中断当前工作 + 开新分支」的流程
  2. git worktree list 查看当前所有 worktree
  3. 删除刚才创建的 worktree,清理干净

下一步

掌握了 Git 的版本管理和并行开发方式之后,下一课我们学习如何使用 Claude Code——一个在终端中与 AI 协作的强大工具。

基于 AI 时代产品实践整理