過去のコミットを確認しようとして git checkout abc1234 のようにコミットハッシュを指定したところ、You are in 'detached HEAD' state. という長い警告が表示されてパニックになった経験はありませんか。この状態はエラーではなく、正しく理解すれば恐ることはありません。この記事では、git detached HEAD の正体と、安全に元の作業に戻る方法を解説します。
このシリーズの全記事
- 第1回:プログラミングエラーメッセージの読み方
- 第2回:VSCodeで「command not found: code」が出た時の解決方法
- 第3回:npmのEACCESエラーをsudoなしで安全に解決する方法
- 第4回:git commitでVimが開いたときにコミットをキャンセルする方法
- 第5回:git detached HEAD状態から安全に復帰する方法【この記事】
- 第6回:git resetとgit revertの違いと使い分け
- 第7回:git restoreで特定のファイルだけを過去に戻す方法
- 第8回:VSCodeのマージエディタでgitコンフリクトを解消する手順
- 第9回:.envをGitにコミットしてしまった場合の履歴からの完全削除
この記事でわかること
- detached HEADはエラーではなく「HEADがブランチを指していない状態」であること
- そのままコミットすると作業が迷子になるリスク
- git switch -cで作業を安全に保存して継続する方法
detached HEADとは何か
Gitには HEAD という特別なポインタが存在します。HEADは「現在自分がどこにいるか」を示す目印です。通常の状態では、HEADは main や feature-xxx といったブランチ名を指しています。
detached HEADとは、HEADがブランチ名ではなく直接コミットハッシュを指している状態です。ブランチとは「コミットに付けた名前(ラベル)」のようなものです。ラベルがついていない状態でコミットを直接指しているため「detached(切り離された)」と表現されます。
通常の状態とdetached HEAD状態の違いを示します。
# 通常の状態:HEADはmainブランチを指している
HEAD → main → コミットC → コミットB → コミットA
# detached HEAD状態:HEADが直接コミットBを指している
HEAD → コミットB → コミットA
main → コミットC → コミットB → コミットA
ポイント
detached HEADはエラーではありません。過去のコードを一時的に確認したり、実験的な変更を試したりするための正常な機能です。
detached HEADのまま作業すると何が起きるか
detached HEAD状態でファイルを変更してコミットした場合、そのコミットはどのブランチにも属しません。
# detached HEAD状態でコミットした場合
git add .
git commit -m "実験的な変更"
# 出力:
[detached HEAD abc5678] 実験的な変更
# 別のブランチに切り替えると警告が出る
git switch main
# 出力:
Warning: you are leaving 1 commit behind, not connected to any of your branches:
abc5678 実験的な変更
If you want to keep it by creating a new branch, this may be a good time
to do so with:
git branch <new-branch-name> abc5678
Switched to branch 'main'
main に戻った時点で、detached HEAD状態でしたコミット(abc5678)はどのブランチからも参照されない「迷子のコミット」になります。Gitのガベージコレクションが実行されると、このコミットは削除されます。
安全に作業を継続・保存する:git switch -c
detached HEAD状態でも作業を続けたい場合、または既にコミットしてしまった場合は、git switch -c で新しいブランチを作成してください。これにより、現在の状態から新しいブランチが派生し、作業が保存されます。
# detached HEAD状態から新しいブランチを作成して保存する
git switch -c experiment-feature
# 出力:
Switched to a new branch 'experiment-feature'
# ブランチが作成されたことを確認する
git branch
# 出力:
* experiment-feature
main
これでコミットが experiment-feature ブランチに属した状態になり、迷子になる心配がなくなります。
detached HEADを抜けて元のブランチに戻る
何もコミットしておらず、ただ元のブランチに戻りたい場合は以下を実行します。
# mainブランチに戻る
git switch main
# 出力:
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
# 現在の状態を確認する
git status
# 出力:
On branch main
nothing to commit, working tree clean
注意
古い解説では git checkout -b を使う方法が紹介されていますが、Git 2.23以降では git switch -c が推奨されるモダンなコマンドです。
まとめ
- detached HEADはエラーではなく、HEADがブランチではなくコミットハッシュを直接指している状態
- そのままコミットすると、ブランチに属さない迷子のコミットになりガベージコレクションで消える
git switch -c <新ブランチ名>で新しいブランチを作成することで、作業を安全に保存して継続できる
シリーズナビゲーション:脱・初学者サバイバルガイド


コメント