最后核验:2026-10-23

先看结论

Worktree 的作用,用官方的话说,是让 Codex 在同一个项目里运行多个互相独立的对话而不彼此干扰。每个 worktree 都有一整套自己的仓库文件,但共享同一份提交与分支信息(.git)。几个要点:

  • 官方列出的常见错误之一:在同一批文件上同时跑多个实时任务,却没有用 Git worktree。并行的编码对话请各自使用一个 worktree。
  • 前提是 Git 仓库:Worktree 底层就是 Git worktree,非 Git 项目用不了。
  • 同一个分支只能在一处签出:这是最容易踩的坑,下文有报错原文与解法。
  • 新 worktree 不等于现成环境:它只带有已提交到 Git 的文件,依赖、.env 之类要靠安装脚本或 .worktreeinclude 补齐。
  • 有自动清理:默认保留最近 15 个由 Codex 管理的 worktree,详见下文。

本文以 ChatGPT 桌面应用中的 Codex 为准,内容整理自 OpenAI 官方文档,核验日期 2026-10-23;界面与默认值以你当前版本为准。

什么时候该开 Worktree

官方给出的理由有三条:

  1. 与 Codex 并行工作,又不打乱你当前的本地(Local)环境;
  2. 把后台任务排队,让你专注在前台的事情上;
  3. 之后想检查、测试或更直接地协作时,再把对话移回本地。

结合官方的最佳实践,下面这些判断是编者的归纳:

  • 同一个项目里要同时推进两件互不相干的事,各开一个对话、各用一个 worktree;
  • 想让 Codex 在后台改动,而你本地正在写别的东西,用 worktree 隔离;
  • 只是一个很小的改动、而且你想直接在本地 IDE 里看,直接用本地就行,不必为了“用而用”。

另外,官方提到,在 Git 仓库里,定时任务可以在专用的后台 worktree 里运行,不会和你正在进行的工作冲突;非 Git 项目的定时任务则直接在项目目录里运行。

三个术语

  • Local(本地检出):你自己创建的那份仓库,在桌面应用里常简称 Local;
  • Worktree:在桌面应用里由你的本地检出创建出来的 Git worktree;
  • Handoff(交接):把一个对话在 Local 与 Worktree 之间移动的流程,Codex 会处理其中需要的 Git 操作,让工作安全地换位置。

官方的比喻是:Local 是前台,Worktree 是后台,Handoff 让对话在两者之间切换。

四步上手

官方的上手步骤如下,先确认你选的项目位于 Git 仓库里:

  1. 选择 Worktree:在新对话页面,输入框下方选 Worktree。可以选一个本地环境,用来给 worktree 运行安装脚本(见下文)。
  2. 选择起始分支:在输入框下方选一个分支作为基础,可以是 main / master、某个功能分支,或者带有未暂存本地改动的当前分支。如果选的分支带有本地未提交的改动,Codex 会把这些改动一并应用到 worktree 上。
  3. 提交提示词:Codex 会基于你选的分支创建一个 Git worktree。默认情况下,它在 detached HEAD(游离 HEAD)状态下工作,不会占用任何分支名,所以可以同时建很多个而不污染你的分支。
  4. 决定在哪里继续:可以直接留在 worktree 里,也可以把对话交接给本地检出。交接会把对话和代码一起移到另一边。

Codex 管理的 worktree 默认放在 $CODEX_HOME/worktrees。想换位置,可以在 Settings > Worktrees 里改 Worktree root。

两条常见路径

路径一:一直留在 worktree 里

如果你想一直在 worktree 上完成工作,用对话页顶部的 Create branch here 把它变成一个分支,然后就可以提交、推送到远端、在 GitHub 上开 PR。你也可以用顶部的 Open 按钮在 IDE 里打开这个 worktree,或使用集成终端。

这条路适合你能直接在 worktree 里验证改动的情况,例如你已经用本地环境的安装脚本装好了依赖和工具。

路径二:把对话交接给 Local

如果想把对话拉到前台,就在对话页顶部选 Hand off,移到 Local。这适合你想在常用的 IDE 窗口里看改动、跑现有的开发服务器,或者你的应用同一时间只能起一个实例的场合。

几点细节:

  • 每个对话会一直对应同一个 worktree;以后再交接回 worktree,Codex 会把它放回同一个后台环境;
  • 反方向也可以:如果你正在 Local 里工作、想腾出前台,用 Hand off 把对话移到 worktree,让 Codex 在后台继续;
  • 交接用的是 Git 操作,所以被 .gitignore 忽略的文件不会随对话移动,除非 Codex 通过 .worktreeinclude 把它们复制进本地托管的 worktree(见下文)。

最容易踩的坑:同一分支只能在一处签出

Git 只允许一个分支同一时间在一个地方被检出。如果你在 worktree 上用 Create branch here 建了 feature/a,又想在本地检出它,会看到官方文档里这样的报错:

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

解法有两种:

  • 用 Handoff:官方的建议是,如果打算在本地检出这个分支,就用 Handoff 把对话移到 Local,而不是想办法在两边同时检出同一个分支;
  • 或者让 worktree 先检出另一个分支,再在本地检出 feature/a。

官方还解释了原因:一个分支代表唯一一个可变引用,Git 把它的 HEAD 视为检出它的 worktree 所有,提交、重置、变基、合并都假定由这一处按顺序推进它。允许多处同时检出同一分支,会带来歧义和竞态,可能丢提交。因此 Git 强制“一个分支一个 worktree”,其他 worktree 仍可通过 detached HEAD 或别的分支引用相同的提交。

让 worktree 里的代码跑起来

官方排错页里有一条专门的“代码在 worktree 上跑不起来”。原因是:worktree 在另一个目录里,默认只继承已经提交到 Git 的文件。依赖、构建产物、.env 这类没进 Git 的东西都不会自动出现。

官方给了两个办法,可以按需组合。

办法一:用本地环境的安装脚本

安装脚本会在 Codex 为新对话创建新 worktree 时自动运行。官方示例是 TypeScript 项目的安装和首次构建:

npm install
npm run build

要点:

  • 本地环境只在桌面应用的 Codex 里可用,在应用的设置面板里配置;
  • 配置存放在项目根目录的 .codex 文件夹里,可以把生成的文件提交到仓库与团队共享;
  • 如果安装步骤因平台而异,可以为 macOS、Windows、Linux 分别定义脚本覆盖默认值;
  • 同一处还能定义“操作(Actions)”,比如启动开发服务器、跑测试,会显示在应用顶栏,在集成终端里运行。

办法二:用 .worktreeinclude 复制被忽略的文件

如果仓库忽略了某些本地文件,而新 worktree 需要它们,就在仓库根目录添加一个 .worktreeinclude,列出要复制的被忽略路径或 .gitignore 风格的模式。官方示例:

# .worktreeinclude
.env
.env.local
config/secrets.json

官方列出的规则:

  • 只复制与 .worktreeinclude 匹配、且被 Git 忽略的文件,其他未被 Git 跟踪的本地文件不会复制;
  • 不要列已被 Git 跟踪的文件(它们本来就在 worktree 里);
  • Codex 会自动把被忽略的 AGENTS.override.md 复制进本地托管的 worktree,不用你再列;
  • 会跳过源符号链接,并且不会覆盖新检出里已经存在的文件;
  • 这个行为只适用于桌面应用本地托管的 worktree,不适用于远程 worktree,也不适用于你在命令行里自己创建的 Git worktree。

编者提醒:官方示例里列了 .env 和 secrets.json,说明这里复制的可能是敏感文件。这意味着密钥会出现在更多目录里,请只列确实需要的文件,并确保它们始终在 .gitignore 里,不要被提交。

办法三:退回本地验证

官方也提到,你可以把改动签出到常规本地项目里再运行。需要在本地检出同一个分支时,官方的做法是用上文的 Handoff,而不是在两边同时检出。

磁盘与清理规则

每个 worktree 都有自己的一套仓库文件、依赖和构建缓存,会占不少磁盘,所以桌面应用会把数量控制在一个合理范围内。

  • 默认保留最近 15 个 Codex 管理的 worktree,可以在设置里改这个上限或关闭自动删除;
  • 不会被自动删除的情形:有置顶对话绑定它、对话仍在进行中、它是永久 worktree;
  • 会被自动删除的情形:你归档了对应的对话,或 Codex 需要删旧的 worktree 才能满足你设置的上限;
  • 删除前会存快照:之后你打开对应对话,会看到恢复它的选项;对话本身仍然留在历史里;
  • 永久 worktree:想要一个长期环境,可以在侧边栏某个项目的三点菜单里创建。它会作为独立项目出现,不会被自动删除,也可以在同一个 worktree 上开多个对话;
  • 定时任务会产生很多 worktree:官方建议归档不再需要的运行记录,除非你想保留它们的 worktree,否则不要置顶这些运行。

并行不出事的几个习惯

下面前两条出自官方文档,后两条是编者的建议。

  • 别让两个对话改同一批文件:每个对话有自己的上下文、消息、结果和目标,可以并行,但改同一批文件时用 worktree 把它们隔开;
  • 一个对话对应一个完整结果:官方最佳实践建议一个对话只做一个完整的单元;这样每个 worktree 里的改动也好审查、好合并;
  • 开工前就定好各自的范围:并行前先想清楚每个任务动哪些目录、用哪个分支名,减少之后合并时的冲突(编者建议);
  • 改动最终还是要合并回主分支:worktree 只是把并行时的互相覆盖挡在外面,合并时的冲突仍要你来处理(编者提示)。

常见问题

选错了运行目标(Local / Worktree / Cloud)怎么办? 取消当前这次运行,在输入框里按上方向键,可以找回你上一条提示词。如果是误取消了创建 worktree 而丢了提示词,也是同样的办法。

Worktree 被删了,对话还在吗? 对话会保留在历史里。Codex 托管的 worktree 在删除前存过快照,重新打开对应对话时可以恢复;永久 worktree 不会因为你归档对话而被自动删除。

能在手机上用吗? Worktree 不会在手机本地运行。ChatGPT 手机应用控制的是你连接的那台电脑上的 Codex,仓库和 worktree 都留在那台电脑(或它使用的远程开发环境)里。

检查清单

  • 项目是 Git 仓库吗?
  • 并行的两个任务动的是不同文件吗?如果不是,各开一个 worktree 了吗?
  • 新 worktree 的依赖和环境怎么来:安装脚本、.worktreeinclude,还是退回本地验证?
  • 需要在本地检出的分支,是不是已经被某个 worktree 占用了?是的话改用 Handoff。
  • 置顶和归档是否合理?定时任务产生的运行有没有及时归档?

下一步读什么

官方来源

  • Worktrees:术语、上手步骤、Handoff、.worktreeinclude、分支限制、清理规则与常见问题
  • Local environments:安装脚本与操作的配置
  • Troubleshooting:代码在 worktree 上跑不起来、定时任务产生过多 worktree、选错目标后找回提示词
  • Best practices:常见错误与“一个对话一个完整结果”
  • Long-running work:并行运行目标时用 worktree 隔离

核验日期:2026-10-23。


WeAPI 企业模型调用入口,统一管理 Key、用量、日志、额度和团队权限 WeAPI 企业模型调用入口