Appearance
用 Git Worktree 让 Codex 并行开发
Git Worktree 可以为同一个仓库创建多个独立工作目录。每个目录使用不同分支或 detached HEAD,因此多个 Codex 任务可以同时修改代码,而不会把未提交改动混在一起。
一句话理解
Worktree 隔离任务现场,Codex 并行执行,测试和代码审查负责最终验收。
适合并行的任务包括:
- 开发新功能时插入一个紧急 Bug 修复;
- 同时推进两个互不依赖的功能;
- 在两个目录中验证同一问题的不同解决方案;
- 不影响当前工作目录地审查 PR 或复现问题。
如果两个任务会频繁修改同一批文件,Worktree 仍然可以隔离开发过程,但最终合并时很可能出现冲突,并不会自动消除协调成本。
Worktree 隔离什么
每个 Worktree 都有自己的:
- 工作目录和检出文件;
HEAD与当前分支状态;- 暂存区;
- 未提交改动。
同一仓库的 Worktree 会共享对象数据库、提交历史、分支引用和远程仓库配置。因此,一个 Worktree 创建的提交和分支,其他 Worktree 可以通过 Git 命令看到。
Worktree 不会隔离:
- 服务端口;
- 数据库、Redis 和消息队列;
- 浏览器登录状态;
- Docker 容器名和其他系统级资源;
- 被
.gitignore忽略的本地文件如何初始化。
WARNING
普通 git worktree add 不会把主目录里的未跟踪 .env、本地数据库或 node_modules 复制过去。每个新目录通常需要重新安装依赖并准备自己的本地配置。
推荐方式:使用 Codex App 原生 Worktree
Codex App 已经原生支持 Worktree,不必手工创建目录和分支:
- 新建 Codex 任务;
- 在输入框下方选择 Worktree;
- 选择任务的起始分支;
- 提交任务描述;
- 为另一个独立任务重复以上步骤。
Codex 默认会在 $CODEX_HOME/worktrees 下创建受管理的 Worktree,并以 detached HEAD 开始工作。任务完成后,可以:
- 点击 Create branch here 创建分支,然后提交、推送并创建 PR;
- 使用 Hand off 把任务和改动移回 Local,在常用 IDE 和本地环境中继续验证。
Codex 管理的 Worktree 不会自动带入所有忽略文件。如果任务需要 .env、.env.local 等文件,可以在仓库根目录创建 .worktreeinclude:
text
# .worktreeinclude
.env
.env.local
config/local.json.worktreeinclude 只适用于 Codex App 管理的本地 Worktree。不要把生产密钥或不应扩散的凭证列入其中。
手工方式:使用 Git 命令
假设主仓库位于 D:\Project\github\aurora-web,需要并行处理登录 Bug 和深色模式:
text
cd D:\Project\github\aurora-web
git fetch origin
git worktree add -b fix/password-validate `
..\aurora-fix-password origin/main
git worktree add -b feat/dark-mode `
..\aurora-dark-mode origin/main现在三个目录共享 Git 历史,但分别拥有独立工作文件:
text
D:\Project\github\
├── aurora-web\
├── aurora-fix-password\
└── aurora-dark-mode\分别进入两个 Worktree 启动 Codex:
text
cd D:\Project\github\aurora-fix-password
codex
cd D:\Project\github\aurora-dark-mode
codex给每个任务写清楚范围和验收条件。例如:
text
修复登录页密码校验跳过长度检查的问题。
只修改登录校验相关模块,补充特殊字符场景的单元测试;
全部相关测试通过后再报告结果。另一个任务可以使用不同的 Codex 窗口或终端独立执行。
为运行环境做隔离
如果两个任务要同时启动应用,需要为它们分配不同资源:
text
# Worktree A
$env:PORT="3000"
$env:SQLITE_PATH="$PWD\local.db"
npm run dev
# Worktree B
$env:PORT="3010"
$env:SQLITE_PATH="$PWD\local.db"
npm run dev具体环境变量取决于项目。某些前端工具不会读取 PORT,需要使用类似 npm run dev -- --port 3010 的参数。数据库 schema、Redis key 前缀、容器名和回调 URL 也要按项目实际情况隔离。
审查每个任务
不要只看 Codex 的完成说明。进入对应 Worktree 检查真实状态:
text
git status --short
git log --oneline --decorate -5
git diff --stat origin/main
git diff origin/main随后运行项目规定的格式化、静态检查、单元测试和端到端测试。对网页功能还应启动实际页面进行浏览器验证。
合并方式
通过 PR 合并
这是团队协作时更稳妥的方式:
text
git push -u origin fix/password-validate
git push -u origin feat/dark-mode分别创建 PR,等待 CI 和审查通过,再根据仓库策略选择普通合并、Rebase 或 Squash and merge。
在本地 Squash
git merge --squash 会把目标分支的最终差异放入暂存区,但不会创建真实的 merge commit,也不会记录该分支已经合并:
text
cd D:\Project\github\aurora-web
git switch main
git pull --ff-only origin main
git merge --squash fix/password-validate
git commit -m "fix: 修复密码校验长度检查"
# 合并下一个任务前,先测试当前 main
git merge --squash feat/dark-mode
git commit -m "feat: 添加深色模式切换"
# 再运行完整测试,确认两个任务组合后仍然正常
git push origin mainIMPORTANT
两个分支都基于旧的 origin/main 开发时,第二次合并可能与第一次产生冲突。每合并一个任务都应解决冲突并重新测试,不能把“Worktree 互不干扰”理解为“合并时不会冲突”。
清理 Worktree
任务确认合并并推送后,在主目录执行:
text
git worktree list
git worktree remove ..\aurora-fix-password
git worktree remove ..\aurora-dark-modegit worktree remove 默认会拒绝删除包含未提交改动或未跟踪文件的目录。先检查并保留需要的内容,不要为了省事直接使用 --force。
Squash 不会建立分支合并关系,因此下面的安全删除可能被 Git 拒绝:
text
git branch -d fix/password-validate确认提交已经进入 main 且分支不再需要后,才使用 git branch -D。如果曾手动删除 Worktree 目录,可以运行 git worktree prune 清理失效的管理记录。
原文中需要修正的说法
| 原说法 | 更准确的结论 |
|---|---|
node_modules、.env 会被 Worktree 隔离 | 目录彼此独立,但新 Worktree 通常没有这些忽略文件,需要安装、生成或通过 .worktreeinclude 复制 |
| Worktree 通常比完整 Clone 少一半以上空间 | 它不重复 Git 对象库,但依赖、构建缓存和工作文件仍可能占用大量空间,不能给固定比例 |
Squash 后可直接用 git branch -d 删除分支 | Squash 不记录合并关系,-d 可能拒绝;确认无误后才使用 -D |
| 告诉 Codex 一句话后无需人工操作 | Codex 可以执行创建、开发和测试,但权限确认、任务边界、冲突处理、测试与代码审查仍需要人负责 |
| 同一个分支绝对不能出现在两个 Worktree | Git 默认禁止同一分支被重复检出,这是应遵守的安全约束;底层存在强制选项,但不应作为并行开发方案 |
最终建议
日常使用时保持 2 至 3 个边界清晰的并行任务通常最容易管理。每个任务都应有:
- 独立 Worktree 或 Codex 管理的工作区;
- 明确的文件范围和验收条件;
- 独立端口与测试数据;
- 合并前代码审查;
- 合并后的完整回归测试。
Worktree 解决的是开发现场隔离,不负责需求拆分、资源隔离和合并正确性。把这些边界写清楚,Codex 并行开发才会真正提高效率。
