← 中文资源

简体中文版本

Git Detached HEAD — 提交不在分支上

在切换分支前把 detached HEAD 上的提交挂到新分支或现有分支,避免提交变得不可达。

阅读英文原文

症状

git status 显示 “HEAD detached at ” 或 “You are in detached HEAD state”;git branch --show-current 没有输出;在此状态下创建的提交在切换到其他分支后消失。

诊断

git status
git log --oneline -1
git reflog --date=iso | head -10

detached HEAD 表示 HEAD 直接指向提交。新提交在创建分支之前不属于任何分支。reflog 会显示最近的提交;如果在 detached 状态提交过,先记下 SHA。

根因

正常情况 HEAD 指向分支,分支再指向提交。detached HEAD 中 HEAD 直接指向提交。Git 仍可创建提交,但没有分支名引用它们,切换分支后只能通过 reflog 找到,直到垃圾回收。

修复

没有新提交时:

git switch -

在 detached 状态创建过提交时:

git switch -c rescue-work
git switch main
git merge rescue-work   # 或 cherry-pick 指定提交

CI 中提交时应显式检出分支或创建分支。

验证

  • git branch --show-current 输出分支名。
  • git log 在该分支上包含恢复的提交。
  • 分支已推送到远程。
  • git status 不再显示 detached HEAD。

风险与预防

在未创建分支的情况下离开 detached HEAD,会让新提交难以找回;reflog 恢复可行但会过期。使用 git switch <branch> 切换分支,只有明确需要时使用 git switch --detach <sha>。离开前检查 git status,有提交就先建分支。