Git で detached HEAD 状態から戻れない・コミットを残せない
タグや SHA を直接 checkout すると detached HEAD になる。
何もしていなければ git switch <branch> で戻れるし、コミットしてしまった場合も git switch -c で新ブランチに退避すれば失わない。
公開: 更新:
要約
You are in 'detached HEAD' state. は どのブランチも指していない HEAD で作業している警告。
コミットしていなければ git switch <branch> で離脱できる。
コミットしてしまった場合も git reflog と git branch を組み合わせれば失わずに済む。
よくある原因
- タグ / SHA を直接 checkout:
git checkout v1.0.0のようにブランチではない参照点を開いた - CI 環境の SHA fetch: 多くの CI は SHA 指定で
git checkout <sha>を打つため常に detached - submodule 更新:
git submodule update後、サブモジュールは登録 SHA を指す detached 状態になる - detached のままコミット: ブランチを切らずにコミットし、別ブランチに移動するとそのコミットは GC 対象になる
解決策
1. まだ何もしていない場合
git status
# HEAD detached at <sha>
git switch - # 直前ブランチに戻る
# または
git switch maingit switch - は直前にいたブランチに戻るショートカット。
詳細は git-switch(新しいタブで開く)。
2. detached でコミットしてしまった場合
git switch -c rescue/feature-x # 今の HEAD を新ブランチに保存
git switch main # 安全に戻れるgit switch -c は 「新ブランチを作って切り替える」 ため、detached 中の作業をそのまま保護できる。
古い git checkout -b <name> と同義。
3. すでに移動して見失った場合
git reflog
# c0ffee1 HEAD@{2}: commit: WIP
# ...
git branch rescue/feature-x c0ffee1reflog から SHA を拾い、ブランチを後付けする。
GC(既定 90 日)が走る前なら基本的に救出できる。
4. submodule での detached
git -C path/to/sub switch main
git -C path/to/sub pullサブモジュールは登録 SHA に固定される設計。
最新を追うときは明示的にブランチに切り替える。
実行例
実際に上記の手順を alpine/git(Git 2.52.0)環境で動かすと、git checkout v1.0.0 直後に You are in 'detached HEAD' state. が表示され、detached 中のコミット保護・reflog からの後付けブランチ作成いずれも終了コード 0 で完了した。
$ git checkout v1.0.0
Note: switching to 'v1.0.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -c with the switch command. Example:
git switch -c <new-branch-name>
Or undo this operation with:
git switch -
Turn off this advice by setting config variable advice.detachedHead to false
HEAD is now at 78b0d8a v1
終了コード: 0$ git status
HEAD detached at v1.0.0
nothing to commit, working tree clean
detached でのコミット: f8e03a9c462b6b78d552ac21ed4bbeb7ddec7891$ git switch -c rescue/feature-x
Switched to a new branch 'rescue/feature-x'
switch -c 終了コード: 0$ git log --oneline -n 3
f8e03a9 wip on detached
78b0d8a v1$ git reflog
626cd8f HEAD@{0}: checkout: moving from rescue/feature-x to master
f8e03a9 HEAD@{1}: checkout: moving from f8e03a9c462b6b78d552ac21ed4bbeb7ddec7891 to rescue/feature-x
f8e03a9 HEAD@{2}: commit: wip on detached
78b0d8a HEAD@{3}: checkout: moving from master to v1.0.0
626cd8f HEAD@{4}: commit: v2$ git branch rescue2 f8e03a9c462b6b78d552ac21ed4bbeb7ddec7891
rescue2 の HEAD: f8e03a9c462b6b78d552ac21ed4bbeb7ddec7891— 2026-08-02 時点の出力