Worktree与Codex/Claude双工具深度对比:开发者避坑指南
摘要
最近同时折腾macOS和Windows上的Codex与Claude桌面版写代码,结果把自己搞晕了。今天用Windows版
最近同时折腾macOS和Windows上的Codex与Claude桌面版写代码,结果把自己搞晕了。
今天用Windows版Claude Desktop写代码,Opus 4.7一轮改完,刷新页面,发现一点变化都没有。当时心里一沉,以为模型降智了。后来才意识到,问题出在一个叫worktree的东西上。
平时管理代码基本只用Git的add、commit、push、pull,连branch和PR都很少碰。突然冒出个worktree,完全超出认知范围。
更让人头疼的是,Codex和Claude管理项目与任务的逻辑完全不同。即便是Claude本身,选择不同目录,表现也会不同。一堆知识盲点叠加在一起,必须彻底理清,否则真要出大问题。
真正的焦虑点是:如果对这些概念一知半解,就会浪费大量tokens。在Claude上,哪怕多探索一下、多问一句、多走错一步,可能一小半配额就没了。所以必须提升认知,才能精准控制配额,用好这些工具。
下面结合实际遇到的问题,梳理这些软件中的概念和操作,最后重点讲解worktree。
1、Codex与Claude的核心差异
这两个工具都是当前编程与智能体领域的顶尖产品,搭配自家模型,表现遥遥领先。但它们的内部组织逻辑截然不同。
这是Codex的界面:
Codex以项目(project)为核心。简单说,一个文件夹对应一个项目,一个项目可以有多个对话,每个对话拥有独立上下文。常见做法是:一个大型功能开发或升级,创建一个对话,所有相关微调都在该对话内完成,从而最大化利用上下文、节省tokens。
这是Claude的界面:
Claude桌面版目前包含三大功能:对话chat、办公cowork、编程code。做编程工作直接切换到code即可。
Claude Code以会话(session)为核心!它没有项目概念,选择一个目录后直接在目录上创建会话。不同会话可以指向不同目录,也可以指向同一个目录。
之前一直用终端版,操作很简单:进入一个目录,启动Claude Code直接开干。转到桌面版后,还是更习惯Codex那种组织方式。因为需要先确定工作目录,而session这种方式确实不太适应。
当然,这不算大问题。真正让人困惑的是worktree这个概念突然出现。
2、Claude不同版本间的差异
Claude Code终端版用了很久,桌面版在macOS上也用过几次。
终端版没有worktree概念,直接选目录写代码即可。之前在macOS上,创建新文件夹开始开发,也没遇到过这个东西。
这次在Windows上升级CodingPlan项目,问题就来了。
突然发现多了一个worktree,而且默认勾选。开始升级功能时完全没留意。开发完成后,刷新页面验证,发现一点变化都没有。当时就懵了——改了半天为什么毫无效果?
经过仔细对比,发现是worktree在作怪。因为在macOS上一切正常,所以怀疑是Windows版本问题。后来才发现并不是系统差异。
macOS也有这个worktree:
Windows也可以不用worktree:
这就让人迷惑了,到底什么意思?
经过不断对比,突然想通了:只要目录里有Git信息,就会出现worktree选项——这才是关键。也就是说,worktree与版本管理原理直接相关。
那么,为什么Claude有这个东西而Codex没有?到底用还是不用?如果用,又该如何管理?
3、worktree到底是什么?
这个概念早就听说过,但从未用过。AI智能体的兴起,让这个比较深度或低频的功能被重新启用。因为worktree直接影响工作流,必须深入搞懂。
专门问过Opus和GPT,一句话概括worktree:同一个Git仓库,开多个“工作目录”同时干不同的活。
Git是什么?关心worktree的人应该都知道。如果还不了解,简单补充一句:Git是代码存档和版本管理工具,写代码做开发必备。一个形象的比喻是游戏存档——有了存档,万一Game Over,可以从存档点继续,不用从头打怪升级。也有人把它比作多人协作记录本:几个人一起开发一个项目,Git可以记录谁改了什么、什么时候改的、为什么改、改了哪些文件,团队协作不混乱。
总之是个好东西。用AI写文档写代码,务必让它帮你装个Git管理起来。而worktree是Git的一个子功能。
简单理解
普通Git仓库通常是这样:
my-project/
.git/
src/
package.json
你在这个目录里只能同时处在一个分支,比如:
main
如果你切到另一个分支:
git checkout feature-login
当前目录里的代码就会被切换成feature-login分支的状态。
worktree是什么
git worktree允许你把同一个仓库的不同分支,分别放到不同文件夹里。比如:
my-project/ # main 分支
my-project-login/ # feature-login 分支
my-project-ui/ # feature-ui 分支
它们看起来像三个项目目录,但底层共用同一个Git仓库数据。
也就是说:
一个 Git 仓库
├─ main 工作目录
├─ login 功能工作目录
└─ ui 功能工作目录
它解决什么问题
1、不用频繁切分支
没有worktree时:
git checkout main
git checkout feature-a
git checkout bugfix-b
切来切去,容易影响当前未提交代码。有worktree后:
cd my-project
cd ../my-project-login
cd ../my-project-ui
直接换文件夹就等于换分支。
2、可以同时跑多个版本
比如你有:
my-project/ # main 分支
my-project-test/ # 新功能分支
可以在两个目录分别启动服务:
cd my-project
npm run dev
另一个终端:
cd my-project-test
npm run dev -- --port 3001
这样可以同时对比主分支和新功能分支。
3、配合AI编程工具
像Claude Code Desktop这类工具用worktree,主要目的是:不直接污染你的主项目目录。它可以在一个独立worktree里改代码、测试、提交。如果改得好,再合并回来;如果改坏了,直接删掉那个worktree,不影响主目录。
常用命令
查看已有worktree:
git worktree list
创建一个新worktree:
git worktree add ../my-project-login feature-login
创建新分支并放到新worktree:
git worktree add -b feature-login ../my-project-login
删除worktree:
git worktree remove ../my-project-login
如果文件夹已经手动删了,清理记录:
git worktree prune
一个关键限制
同一个分支不能同时被两个worktree使用。比如main已经在my-project里用了,就不能再让另一个worktree也checkout到main。因为Git要避免两个目录同时修改同一个分支导致混乱。
4、实操演示
光说不练假把式,就在Claude上实操一下。上面列出的各种命令可以作为基础,但在Claude里,不需要记忆这些命令。
直接在某个目录下创建一个worktree的文件夹作为项目目录。然后在Claude桌面版中选中这个目录:
从截图中可以看到,默认选中了本地(Local)下面的worktree文件夹。此时右侧没有worktree相关的勾选选项——因为这是一个全新的项目,还没有版本管理信息。
然后让它帮我创建一个网页,只要输入上面一句话,一个不错的学习网站就有了。
接着让它创建Git版本管理:
很快就搞好了:
完成。具体操作:
git init 初始化仓库
创建 .gitignore,忽略了 .DS_Store、编辑器目录、以及 .claude/(Claude Code 的工作文件)
提交 index.html + .gitignore 为第一个版本,commit hash 1d3d949
这样就不用担心代码丢掉,或者被改坏了。
可以看到目录中已经有一个.git的隐藏文件夹了,并且添加了忽略文件.gitignore,以及网页index.html。这个时候,再去点下New session,就可以看到worktree的选项了。
上面说过,只要这个目录下有Git信息,就会自动勾选worktree。正常来说,完全可以在上面的对话里,直接让它创建worktree并进行管理。但为了更好的演示,就新建一个会话。
这个会话的目标是给这个网页创建一个浅色模式,并设为默认模式。这样对比更清晰一些。提示词如下:
一句话下去就全部搞定了:
可以看到右边已经显示了浅色的网页,左下方出现了一个分支信息。这个时候,如果手动打开主目录下的index.html,会发现并没有修改,还是黑色主题。这就是worktree和单纯的分支切换最大的区别。worktree这种方式,并不会直接在主目录下修改文件。
经过实测,Claude的worktree目录如下:
它会放在当前工作目录下的.claude文件夹里面!
另外值得注意的一点是,一个worktree对应一个分支。
通过命令可以看到,有两个worktree,对应两个分支。也就是说创建worktree的时候其实同时创建了一个分支。现在就可以在worktree这个分支里尽情地修改了,完全不影响主目录的内容。修改的内容可以单独提交多个版本。同时还可以再开一个worktree的对话,同时开发其他功能。两个worktree互不影响。
接下来让它优化了内容、界面、交互:
它甚至还做了知识测验!
这已经是一个非常棒的学习网页了。差不多了!让它并入主目录了:
它的反馈信息如下:
先检查状态和 worktree 列表。
合并和清理已基本完成,但有一个 Windows 层面的限制需要说明:
**已完成 ✓**
- 改动已提交到 `claude/unruffled-ramanujan-0a45ab`(commit `872b8b7`)
- 已 `--no-ff` 合并到 `master`(commit `86d92dc`)
- 已删除分支 `claude/unruffled-ramanujan-0a45ab`
- Git 已注销 worktree 元数据(`git worktree list` 已不再显示)
**残留 ⚠️**
- 物理目录 `E:Jarvis_githubworktree.claudeworktreesunruffled-ramanujan-0a45ab` 还在磁盘上
- 删不掉的原因:**当前这个 Claude Code 会话本身就运行在这个目录里**,Windows 锁住了 cwd 句柄。我从内部无法删除自己所在的目录
**怎么处理这个空目录**
请在 Claude Code 中切到主目录会话,或直接关闭当前会话后,在主目录手动执行:
```powershell
Remove-Item -Recurse -Force "E:Jarvis_githubworktree.claudeworktreesunruffled-ramanujan-0a45ab"
```
或在 PowerShell / 资源管理器里直接删除该目录即可。Git 那边已经干净了,删除目录纯属物理清理。
它已经执行了各种命令,唯一没搞定的是文件夹还在。因为在Claude里面创建会话的时候,Claude占用了这个目录,所以删不掉。这没什么问题,关闭这个对话,手动删除即可,或者不删也行。如果不介意冗余,完全可以不用清理。
重点是,现在的主分支主目录已经升级了!
为了演示这个功能,消耗了31%的五小时配额!!!
这种轻量级的活,真不适合让Opus 4.7来干!完全就是大炮打蚊子!当然,这也是值得的。只要学会了这个概念,以后就不浪费了。
个人感觉,如果项目不是很复杂,就不要去搞worktree了,直接在主目录修改,反正有版本管理,也不用担心搞坏。如果项目比较复杂,同时需要让AI并行开发多个功能,那么worktree是一个很不错的方式。另外,Claude是直接提供了这个功能,而Codex没有直接提供,但也可以让Codex来帮忙管理worktree!
来源:互联网
本网站新闻资讯均来自公开渠道,力求准确但不保证绝对无误,内容观点仅代表作者本人,与本站无关。若涉及侵权,请联系我们处理。本站保留对声明的修改权,最终解释权归本站所有。