Skip to content

claude --worktree 退出时不再悄悄删分支:detached HEAD 丢提交问题已修 ​

claude --worktree 会为本次会话单独建一个 git worktree 和对应分支,让 Claude 在隔离的目录里改代码,不碰你的主工作区。会话结束时,Claude Code 会帮你收尾清理。问题就出在这个「收尾」上。

以前哪里会出事 ​

在 2.1.304 之前,如果退出时那个 worktree 处于下面两种状态之一:

  • HEAD 是分离的(detached HEAD),比如在里面 git checkout <某个提交> 看过历史;
  • HEAD 切到了另一个分支,不再是会话创建时的那个分支;

Claude Code 会不经询问直接删除这个 worktree 和它的分支。如果你或 Claude 在这种状态下做了提交,而这些提交没有被任何其他分支引用,它们就可能跟着丢掉。

这类操作恰恰很常见:让 Claude 回到某个旧提交复现 bug、在分离状态下试一个修复并顺手提交,然后结束会话。

2.1.304 之后 ​

CLI 2.1.304 修复了这个问题:遇到 HEAD 分离或在其他分支上的情况,退出时不会再静默删掉 worktree 和分支,避免把你的提交一起带走。升级即可:

bash
claude update
claude --version   # 确认 ≥ 2.1.304

还在旧版本上怎么自保 ​

  • 退出会话前,先在 worktree 里看一眼状态:git status、git log --oneline -5;
  • 处于分离 HEAD 又有新提交,先给它起个名字留住:git switch -c keep/my-fix,或者推到远端;
  • 重要的实验分支,结束前 git push 一份,别只留在本地 worktree 里。

已经丢了,还能不能找回 ​

被删掉的分支只是引用没了,提交对象往往还在仓库里,直到被垃圾回收。可以在主仓库里试试:

bash
git fsck --lost-found        # 列出悬空提交
git show <提交哈希>           # 确认内容
git branch rescue <提交哈希>  # 找到后重新挂个分支

越早做越好;一旦执行过 git gc 或过了回收期限,就很难再捞回来了。

同版本另一处安全修复 ​

2.1.304 还补上了一个删除保护的漏洞:对挂载的磁盘或顶层目录执行 rm -r(例如 /Volumes、/media、WSL 下的 /mnt/c),以前不会像 rm -rf /Applications 那样弹出安全确认,现在会了。

小结 ​

  • 2.1.304 之前,worktree 的 HEAD 分离或在别的分支上时,claude --worktree 退出会不问就删 worktree 和分支,可能丢提交;
  • 升级到 2.1.304 即可避免;旧版本下退出前先给提交起分支名或推远端;
  • 误删后尽快用 git fsck --lost-found 找回悬空提交;
  • 同版本 rm -r 挂载盘、顶层目录也会触发安全确认了。

Claude-cn.org,专注于 Claude Code 中文教程