症状
git status 显示 “HEAD detached at 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,有提交就先建分支。