如果你已经在用 Codex app 做代码修改、排障或自动化,那么 Worktree 几乎是迟早会碰到的一个概念。它的价值不在于“又多了一个 Git 名词”,而在于让 Codex 能在同一个项目里并行干活,同时尽量不打乱你当前本地 checkout。

这篇文章基于 OpenAI 官方文档整理,重点回答 4 个问题:worktree 到底是什么、为什么 Codex 需要它、Local 和 Worktree 怎么切换、以及使用时有哪些限制要提前知道。

Codex Worktrees 是什么

OpenAI 官方文档里提到,Codex app 里的 worktree 底层使用的是 Git worktrees。它本质上是在同一个仓库基础上,再创建一份额外的工作副本。

这个副本有两个关键特征:

  • 它有自己独立的文件工作区,可以单独改代码
  • 它和原仓库共享 .git 元数据,所以仍然属于同一个 Git 仓库体系

这意味着你可以在一个项目里,同时保留自己的本地开发现场,再让 Codex 在另一个独立副本里继续工作。

OpenAI 也明确写到:在 Git 仓库里,Codex 的 automations 会运行在专门的后台 worktree 上,以避免和你当前正在做的事情发生冲突。

先理解 3 个术语

官方文档里有 3 个词最好先记住:

  • Local checkout:你自己创建并正在使用的本地项目目录
  • Worktree:Codex 从这个本地项目衍生出来的额外工作副本
  • Handoff:把线程从 Local 移到 Worktree,或者再从 Worktree 移回 Local 的过程

如果只记一句话:Local 更像前台,Worktree 更像后台,Handoff 就是两者之间的安全切换机制。

为什么要用 Worktree

OpenAI 给出的理由很直接,我把它翻成更接近日常开发的话:

1. 让 Codex 并行工作,不打断你当前环境

你本地可能正开着 IDE、开发服务器、数据库连接和一堆未提交改动。如果 Codex 直接在当前目录里改文件,很容易互相影响。

而 worktree 的作用,就是把 Codex 的动作隔离出去。

2. 让后台任务和前台任务分开

如果你希望 Codex 在后台继续做这些事,worktree 很适合:

  • 继续追一个复杂排障线程
  • 跑自动化巡检
  • 处理另一个功能分支上的改动
  • 先准备一轮修改,等你空了再看

3. 需要时再把线程带回本地

当你准备认真 review、联调或测试时,可以再把线程 hand off 回 Local,在你熟悉的 IDE 和本地运行环境里继续。

这比一开始就让所有东西都在当前目录里混着跑,要稳很多。

在 Codex app 里怎么开始用

按官方文档的流程,步骤并不复杂:

  1. 新开线程时,在输入框下方选择 Worktree
  2. 选择要作为起点的分支
  3. 提交任务,Codex 会基于这个分支创建 worktree
  4. 后续决定继续留在 worktree,还是 hand off 回 Local

这里有两个细节值得注意。

可以从带本地未提交改动的分支启动

官方文档说明,起始分支可以是:

  • main / master
  • 某个 feature branch
  • 你当前这个带有未暂存本地改动的分支

这点很实用,说明 worktree 并不只适合“干净仓库”,也适合从你当前工作现场分出一个并行任务。

默认是 detached HEAD

Codex 创建 worktree 后,默认会在 detached HEAD 状态下工作。

这样做的好处是:

  • 不会一上来就污染你已有分支
  • 可以比较轻量地创建多个 worktree
  • 更适合把 worktree 当成一次独立任务环境

如果后面你决定长期保留这部分修改,再在 worktree 里创建 branch 即可。

Local 和 Worktree 之间怎么切换

这部分是我觉得官方文档最有价值的地方,因为它讲的不是“Git 原理”,而是 Codex 里的实际协作方式。

OpenAI 的建议可以概括成两条路径。

路径 1:一直在 Worktree 里完成任务

如果你能直接在 worktree 里验证结果,比如:

  • 依赖已经安装好
  • 本地环境脚本能正常初始化
  • 这个任务不需要占用你当前主开发环境

那最省事的方式就是继续留在 worktree 里。

官方文档提到,这时你可以:

  • 在当前 worktree 上创建分支
  • 直接提交代码
  • 推送到远端仓库
  • 在 GitHub 上发起 PR

路径 2:把线程 Hand off 回 Local

如果你想把任务拉回前台,比如:

  • 想在日常 IDE 里仔细看 diff
  • 需要用你现有的开发服务验证
  • 你的应用一次只能跑一个实例

那就适合把线程 hand off 回 Local。

OpenAI 文档特别强调,Handoff 会替你处理底层 Git 操作,让线程和代码一起安全迁移。

而且,每个线程会持续关联同一个 worktree。也就是说,后面如果你再把这个线程移回 Worktree,Codex 会回到原来那份后台环境继续干,而不是重新开一个全新的副本。

适用场景

如果你不确定自己该不该用 worktree,可以先看下面这些高频场景:

  • 你正在本地开发,同时想让 Codex 并行处理另一个任务
  • 你不希望自动化任务直接碰你当前工作目录
  • 你想把 review、排障、重构这类耗时任务放到后台慢慢推进
  • 你需要在同一仓库里并行尝试多个方向

一句话概括:只要你担心“Codex 改动会不会影响我当前开发现场”,worktree 基本就是优先选项。

注意事项

这部分建议认真看,因为基本都是容易踩坑的点。

1. 同一个分支不能同时在两个 worktree 里 checkout

官方文档明确说明:Git 不允许同一个分支同时被两个 worktree checkout。

所以如果你已经在某个 worktree 里把改动落到了 feature/a 分支上,那么你不能同时在 Local 里也 checkout 这个分支。否则会碰到类似这样的错误:

fatal: 'feature/a' is already used by worktree at '<WORKTREE_PATH>'

正确做法通常有两个:

  • 想继续留在后台环境,就让它待在 worktree
  • 想切回本地开发,就用 Handoff,而不是强行在两个地方同时 checkout 同一分支

2. .gitignore 里的文件不会跟着 Handoff 走

这点官方文档也点得很明确。由于 Handoff 依赖 Git 操作,凡是被 .gitignore 忽略的文件,都不会自动在线程切换时一起带过去。

这意味着如果你的运行依赖某些本地生成文件、缓存文件或临时配置,切换前要心里有数。

3. Worktree 可能很占磁盘

每个 worktree 都有自己的一套仓库文件、依赖、缓存和构建产物,所以磁盘占用不是小事。

按官方文档,Codex 默认会保留最近 15 个 Codex-managed worktrees,并尝试自动清理更旧的那些。

4. 自动清理不是无脑删除

官方文档提到,以下几类 worktree 通常不会被自动删掉:

  • 绑定了 pinned conversation
  • 对应线程还在进行中
  • 它本身是 permanent worktree

而在自动删除前,Codex 还会先保存一个 snapshot,后续重新打开相关对话时可以恢复。

进阶:Codex-managed worktree 和 permanent worktree 的区别

默认情况下,线程使用的是 Codex-managed worktree。这种 worktree 更偏一次性、轻量级、可回收,通常一条线程对应一份后台副本。

如果你想要一个长期存在的环境,官方文档建议创建 permanent worktree。它不会像临时后台 worktree 那样被自动删除,而且可以从同一个 permanent worktree 开多个线程。

简单理解:

  • 临时任务、自动化、并行尝试:优先用 Codex-managed worktree
  • 想长期保留一个独立开发副本:考虑 permanent worktree

一句话总结

Codex Worktrees 的核心价值不是“多一个目录”,而是让你把 AI 代理的后台执行和自己的前台开发现场分开。只要你理解了 Local、Worktree、Handoff 和分支限制这几个点,就能更放心地让 Codex 并行推进任务。

参考链接

  • OpenAI 官方文档(Codex Worktrees):https://developers.openai.com/codex/app/worktrees