できない.dev

Git で detached HEAD 状態から戻れない・コミットを残せない

タグや SHA を直接 checkout すると detached HEAD になる。
何もしていなければ git switch <branch> で戻れるし、コミットしてしまった場合も git switch -c で新ブランチに退避すれば失わない。

#head#detached#switch#checkout#reflog

公開: 更新:

要約

You are in 'detached HEAD' state.どのブランチも指していない HEAD で作業している警告。
コミットしていなければ git switch <branch> で離脱できる。
コミットしてしまった場合も git refloggit branch を組み合わせれば失わずに済む。

よくある原因

  1. タグ / SHA を直接 checkout: git checkout v1.0.0 のようにブランチではない参照点を開いた
  2. CI 環境の SHA fetch: 多くの CI は SHA 指定で git checkout <sha> を打つため常に detached
  3. submodule 更新: git submodule update 後、サブモジュールは登録 SHA を指す detached 状態になる
  4. detached のままコミット: ブランチを切らずにコミットし、別ブランチに移動するとそのコミットは GC 対象になる

解決策

1. まだ何もしていない場合

git status
# HEAD detached at <sha>
git switch -      # 直前ブランチに戻る
# または
git switch main

git 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 c0ffee1

reflog から 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 で完了した。

== versions ==
git version 2.52.0
== run ==
--- git checkout v1.0.0 (detached HEAD を想定)---
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 b3b2333 v1
終了コード: 0
--- git status (HEAD detached at ... を表示)---
HEAD detached at v1.0.0
nothing to commit, working tree clean
--- detached のままコミットする ---
detached でのコミット: afe13971a1e090224c35d1ca46045edd3eba722a
--- 解決1: git switch -c で新ブランチに退避 ---
Switched to a new branch 'rescue/feature-x'
switch -c 終了コード: 0
afe1397 wip on detached
b3b2333 v1
--- 既定ブランチに戻る ---
--- 解決2: 失った想定で reflog から SHA を拾う ---
c86193d HEAD@{0}: checkout: moving from rescue/feature-x to master
afe1397 HEAD@{1}: checkout: moving from afe13971a1e090224c35d1ca46045edd3eba722a to rescue/feature-x
afe1397 HEAD@{2}: commit: wip on detached
b3b2333 HEAD@{3}: checkout: moving from master to v1.0.0
c86193d HEAD@{4}: commit: v2
--- git branch <name> <sha> で後付けで branch を貼る ---
rescue2 の HEAD: afe13971a1e090224c35d1ca46045edd3eba722a

— 2026-05-29 時点の出力

この記事は役立ちましたか?