
git worktree 让多个 Claude session 各住独立目录、各操独立分支,彻底告别多任务改文件冲突。本篇完整拆解 --worktree 标志用法、baseRef 分支策略(origin/HEAD vs 本地 HEAD vs PR 直通)、.worktreeinclude 的 .env 自动同步机制、子 Agent 的 isolation: worktree 永久配置,以及 worktree 的自动清理规则(含 -p 非交互模式的手动清理陷阱),附五条可落地的实践建议。
--worktree 就是为了解决这件事而生的。git worktree 是 Git 原生功能:在同一个仓库下创建多个独立的工作目录,每个目录有自己的文件状态和分支,但共享同一份 commit 历史和远程。2--worktree 在此基础上多做了一层封装:--worktree <name> 都在 .claude/worktrees/<name>/ 新建一个 worktree,同时在仓库里创建名为 worktree-<name> 的分支# 最常见用法:指定 worktree 名称
claude --worktree feature-auth
# 同时在另一个终端开第二个
claude --worktree bugfix-123
# 懒得起名?Claude 自动生成随机名(如 bright-running-fox)
claude --worktree--worktree 之前,需要先单独运行一次 claude(接受 workspace trust 对话框)。非交互的 -p 模式跳过了信任检查,claude -p --worktree 可以直接用。.claude/worktrees/ 加进 .gitignore,否则 git status 会列出一堆无关文件。
--worktree 创建的目录结构示意(AI 生成图) origin/HEAD(远程默认分支)创建,拿到干净的远程最新状态。这对"基于稳定主干开任务"场景很合适。worktree.baseRef 设为 "head":1{
"worktree": {
"baseRef": "head"
}
}"fresh"(默认,从 origin/HEAD)和 "head"(从当前本地 HEAD)两个值,不支持任意 git ref。# 基于 PR #1234 创建 worktree
claude --worktree "#1234"pull/1234/head 并在 .claude/worktrees/pr-1234/ 建立 worktree。对于 code review 过程中需要本地验证改动的场景非常便利。.env、.env.local、config/secrets.json 这些在 .gitignore 里的文件不会自动过来——这意味着 Claude 到新 worktree 里可能跑不起来项目。.worktreeinclude,语法和 .gitignore 一致:.env
.env.local
config/secrets.json.gitignore 里」的文件才会被复制。已追踪(tracked)的文件不受影响,不会被意外复制。--worktree 交互会话、子 Agent 的 worktree(下面会讲)、桌面端的并行 session。
.worktreeinclude 的文件复制流程:只有同时「匹配模式」且「在 .gitignore 里」的文件才会被复制(AI 生成图) isolation: worktreeisolation: worktree 的子 Agent 每次被启动都会自动获得一个临时 worktree。任务完成后,如果这个 worktree 里没有任何改动(无未提交文件、无新文件、无新 commit),它会被自动删除,保持仓库干净。worktree.baseRef 设置——设了 "head" 时,子 Agent 也会从当前本地 HEAD 出发,继承你主分支上还没推的改动。| 情况 | 自动处理 |
|---|---|
| 无未提交改动、无新文件、无新 commit | 自动删除 worktree 及对应分支 |
| 上面条件加上 session 有名称 | Claude 会先询问是否保留 |
| 有未提交改动或新 commit | 提示你选择保留还是删除 |
-p 非交互模式 | 不自动清理,需手动 git worktree remove |

cleanupPeriodDays 设置的天数,且没有未提交改动、新文件、未推 commit 时,自动清除。通过 --worktree 手动创建的 worktree 不受这个自动清扫影响。git worktree lock 锁住自己的 worktree,防止并发清理意外删掉正在用的目录;Agent 结束后自动解锁。git worktree remove ../project-feature-a
# 有未提交改动时加 --force
git worktree remove --force ../project-feature-a# 新分支 + 指定位置
git worktree add ../project-feature-a -b feature-a
# 已有分支
git worktree add ../project-bugfix bugfix-123
# 进入后启动 Claude
cd ../project-feature-a && claude
# 查看所有 worktree
git worktree list--worktree 默认使用 git 实现。SVN、Perforce、Mercurial 等项目可以通过配置 WorktreeCreate 和 WorktreeRemove Hook 完全替换默认逻辑:1{
"hooks": {
"WorktreeCreate": [
{
"hooks": [
{
"type": "command",
"command": "bash -c 'NAME=$(jq -r .name); DIR=\"$HOME/.claude/worktrees/$NAME\"; svn checkout https://svn.example.com/repo/trunk \"$DIR\" >&2 && echo \"$DIR\"'"
}
]
}
]
}
}.worktreeinclude 的文件复制逻辑不再执行——需要在 Hook 脚本里自己处理环境变量文件的拷贝。origin/HEAD,需要继承本地改动再切 head——baseRef 设置直接决定 Claude 看到的代码快照,弄错了很难察觉.claude/worktrees/ 加进 .gitignore 是必做项,不然 git status 噪音会干扰你和 Claude 对仓库状态的判断.worktreeinclude 比手动拷贝 .env 更可靠——每次新建 worktree 自动同步,不会因为忘了复制而让 Claude 跑不起项目-p 模式的 worktree 必须手动清理——CI/CD 脚本里跑完记得加 git worktree remove,否则会积累大量孤立目录isolation: worktree,而不是每次口头提醒——永久配置比临时口头约束更可靠,Agent 复用时也不会忘docs.anthropic.com
git-scm.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.