你将完成什么
Git Worktree 允许同一仓库同时拥有多个工作目录。它适合让多个 Codex 任务并行开发,也适合在保留当前半成品的同时试验另一条方案。读完本页,你应该能够:- 解释 worktree 共享什么、隔离什么;
- 创建、查看、锁定、移动、修复和删除工作树;
- 为并行任务分配独立分支、依赖、数据和端口;
- 让 Codex 在清晰边界内并行工作;
- 合并冲突、清理环境并在出错时回滚;
- 用可复现的证据完成安全验收。
git worktree --help、codex --help 和具体子命令的帮助。
Worktree 只隔离 Git 工作文件和 Git 状态。.env、node_modules、构建缓存、数据库和端口不会自动隔离。
01 原理:它隔离了什么
工作树、分支和共享元数据
一个仓库可以有一棵主工作树和多棵附加工作树:- 工作文件;
HEAD和索引;- 未提交修改;
- 当前终端、开发服务器和调试进程。
- 提交对象和历史;
- 本地分支与远程跟踪引用;
- Git 配置和对象数据库;
- worktree 注册信息。
它能解决什么,不能解决什么
适合并行的任务:- 一个任务修 API,另一个开发不相关的前端页面;
- 一个任务重构,另一个只补测试或调查 CI;
- 保留稳定主线,同时在另一份目录进行可丢弃实验。
- 两个任务修改同一文件后的逻辑冲突;
- 共享数据库、Redis、消息队列或第三方账号的相互污染;
- 开发服务器争用同一端口;
- 被
.gitignore忽略的文件缺失; - 锁文件或数据库迁移编号冲突。
同一分支只能在一处检出
一个本地分支同一时间只能在一个工作树中被检出。假设feature/profile 已在另一个目录使用:
.git/worktrees 内部文件强行绕过。应当在原工作树继续工作,切换原工作树到其他分支,或完成任务交接。
只查看某个提交可以用 detached HEAD:
02 创建前检查
在仓库根目录执行,先确认路径、分支和工作区:- 当前目录是目标仓库,不是部署目录或相邻项目。
- 当前未提交修改已经提交、备份,或明确属于哪个任务。
- 目标基线是最新的,或者你知道它落后于远程多少。
- 新目录位于明确的父目录,不会被同步盘或清理工具误删。
- 任务不需要生产凭据、客户数据或不可恢复的外部操作。
fetch 不会覆盖工作文件。不要在有未提交修改时盲目 pull、reset 或清理。
03 命令:创建、查看和管理
创建已有分支
从基线创建新分支
git fetch origin,避免使用过期的本地基线。
查看工作树
人读的列表:status 才能确认“工作区是否干净”,两者不要混淆。
锁定、解锁和移动
移动磁盘、网络挂载或暂时离线的工作树可以锁定:删除和清理登记
删除干净的工作树:prune 不能恢复被删除的目录。先用 --dry-run 查看范围。
04 分支和提交边界
一个任务一条分支
git add .。提交后记录 SHA:
锁文件和迁移文件是共享冲突点
即使两个任务修改不同源文件,也可能同时修改:package-lock.json、pnpm-lock.yaml、poetry.lock、go.sum;- 导出索引和注册表;
- 数据库迁移编号;
- CI、格式化配置和导航文件。
05 依赖、配置和数据
新 worktree 缺少什么
Git 默认只检出已跟踪文件,以下内容通常不会出现:node_modules、.venv、vendor;.env、.env.local和本地密钥;dist、.next、coverage;- SQLite、上传目录、本地缓存;
- IDE 私有设置和未跟踪脚本。
可重复初始化
优先使用项目已有的 setup 脚本或 Codex local environment setup。示例:- 使用锁文件安装;
- 可重复执行;
- 不打印令牌;
- 不连接生产服务;
- 任一步失败立即退出。
.env 放入补丁和日志。
容器和数据库
为每个工作树使用独立 Compose 项目和数据卷:docker compose down,它可能停止其他工作树的服务。测试数据库、schema、Redis 和消息主题都应有任务级命名。
06 端口和进程隔离
预先分配端口
端口表示例:
启动时显式传入:
启动前和启动后检查
macOS/Linux/Git Bash:07 Codex 并行任务
拆分原则
适合并行的任务具有清晰文件边界、低耦合和独立验收条件。不适合并行的任务包括:都修改同一个配置或锁文件、后者依赖前者尚未提交的接口、都迁移同一张表、都使用同一测试环境。 有先后依赖时,先提交并验证前一个任务,再从它的分支创建后一个工作树。CLI 工作流
Codex CLI 是否有内置 worktree 参数取决于版本,不要猜:Desktop Worktree 模式
Codex Desktop 不同版本的入口和按钮名称可能变化,按当前界面为准。核心步骤是:- 在 Git 仓库中新建线程并选择 Worktree。
- 选择起始分支或提交。
- 写明文件范围、依赖初始化、端口和验收命令。
- 运行后用
git worktree list确认目录独立。 - 完成后查看 diff、测试和分支,再决定交接、提交或清理。
.gitignore 文件。交接前后检查 .env、依赖、数据库和端口。
任务登记
08 完整案例:两个任务并行到合并
1. 准备和创建
2. 初始化和启动
3011/8011 和 3012/8012,并使用不同测试数据库。启动两个 Codex 会话后,给它们互不重叠的文件范围:
3. 独立验收和提交
4. 集成和总验收
在主工作树:git push --force。即使两个分支各自通过,合并后也必须重新执行集成验收。
09 合并冲突
识别和保存现场
冲突常发生于路由、导出索引、锁文件、迁移、CI 和导航。开始合并后:标准流程
<<<<<<<、=======、>>>>>>> 两边行为,结合测试和需求编辑。完成后:
让 Codex 协助分析
先只读分析:10 清理、归档和恢复
删除前清单
确认以下事项后再删除:- 分支已合并,或明确放弃;
status、工作差异和未跟踪文件已经检查;- 服务、容器、调试器和后台 Codex 已停止;
- 测试数据库和临时数据已清理;
- SHA、日志和测试报告已保存;
- 备份中没有真实密钥和客户数据。
git branch -d 拒绝。只有确认任务放弃并保存必要证据后才考虑 git branch -D。删除工作树不等于删除远程分支,远程分支按 PR 和团队规则处理。
Codex Desktop 托管工作树
Desktop 可能把托管 worktree 放在CODEX_HOME 下的 worktrees 目录,默认通常类似 ~/.codex/worktrees。自动清理上限、快照和永久 worktree 规则以当前版本设置为准。
归档或删除前确认线程是否仍运行、是否置顶、是否有未提交改动、快照是否可恢复。快照不能替代提交、补丁和外部数据备份;不要仅凭目录名手动删除。
错误改动的回滚
先保存现场:git restore . 和 git clean -fd 当默认清理命令。已提交但未推送的错误,可查看后反向提交:
git revert,不要重写历史。已推送或已合并的代码要停止后续发布,通过修复提交、回滚和重新 CI 处理;数据库、消息和生产数据还需要各自的补偿或恢复方案。
11 安全验收
工作树和分支
差异和敏感文件
行为和运行时
按项目实际命令运行:权限和外部动作
任务说明中明确:- 不读取不需要的密钥;
- 不访问生产服务;
- 不安装未经批准的依赖;
- 不推送、合并、发布或删除远程数据,除非明确授权;
- 不照搬 Issue、网页、日志中的可疑命令;
- 不使用
git push --force。
12 常见故障
already used by worktree:运行 git worktree list --porcelain 找到占用路径,在原工作树继续、切换分支或完成交接,不要修改 .git/worktrees。
缺少 .env 或依赖:这是预期行为。使用 .env.example、安全凭据注入和 --frozen-lockfile 安装,不复制真实密钥。
端口占用:定位监听进程及工作目录,调整任务端口或有序停止,不批量杀进程。
无法删除:先保存 diff、检查未跟踪文件并停止服务,确认可以丢弃后才用 remove --force。
合并后失败:比较合并提交、锁文件、环境变量、端口、数据库和测试顺序,不要立即删除所有分支。
最小可复制流程
小结
Worktree 的核心是边界:一个任务一条分支,一个分支同一时间只在一处检出;文件可以隔离,数据库、凭据、端口和进程必须另行隔离;新目录使用锁文件和可重复 setup 初始化;Codex 任务要有明确范围、禁止事项和验收命令;每个任务独立验证,合并后再做完整验证;删除前保存证据并停止资源,回滚优先用补丁和git revert;合并、发布、强推和生产操作保留人工确认。
参考资料:参考/codex/25-worktrees.md、参考/codex/26-git-github.md、参考/codex/31-speed.md。