You are in 'detached HEAD' state は、ブランチではなく、特定のコミット(タグやコミット ID)を直接開いている状態です。 エラーではなく、ファイルを見る・試すだけなら問題ありません。

困るのは、この状態でコミットして、ブランチに戻ったときです。コミットはどのブランチにも属していないので、git log から消えたように見えます。多くの場合、git reflog で取り戻せます。

状況 すること
ブランチに戻りたいだけ(コミットしていない) git switch main(または git switch -)
detached HEAD のままコミットした、まだ移動していない git switch -c 新しいブランチ名
コミットしたあと、ブランチに戻ってしまった(消えたように見える) git reflog でコミット ID を探し、git branch 新しいブランチ名 コミットID

確認環境:git 2.43.0(確認日 2026年10月11日)。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「detached HEADの戻し方|gitのコミットが消えたとき」

detached HEAD とは

$ cat .git/HEAD
ref: refs/heads/main                          ← 通常:ブランチ(main)を指している

$ git checkout v1.0
$ cat .git/HEAD
47177d9356d8122adfb8957faa63d78546c24533      ← detached:コミットを直接指している

通常の HEAD は「ブランチ」を指し、コミットするとブランチが進みます。detached HEAD では「コミット」を直接指すので、コミットしても、どのブランチも進みません。

$ git status
HEAD detached at v1.0

$ git branch
* (HEAD detached at v1.0)
  main

detached HEAD になる操作

操作 結果(確認環境)
git checkout v1.0(タグ) detached HEAD
git checkout 47177d9・git checkout HEAD~1(コミット) detached HEAD
git checkout origin/hotfix(リモートのブランチ名) detached HEAD(ローカルのブランチにはならない)
rebase の途中でコンフリクト (no branch, rebasing side)
clone --recurse-submodules 直後のサブモジュール detached HEAD(記録されたコミットを開くため)

git switch では、うっかり detached にならない

$ git switch v1.0
fatal: a branch is expected, got tag 'v1.0'
hint: If you want to detach HEAD at the commit, try again with the --detach option.

$ git switch origin/hotfix
fatal: a branch is expected, got remote branch 'origin/hotfix'

git switch はブランチ以外を指定するとエラーになり、--detach を付けたときだけ detached HEAD になります。 リモートのブランチで作業したいときは、git switch hotfix(origin/ を付けない)で、追跡するローカルのブランチが作られました(branch 'hotfix' set up to track 'origin/hotfix'.)。

やりたいこと git switch git checkout
ブランチに切り替え git switch main git checkout main
タグ・コミットを見る git switch --detach v1.0 git checkout v1.0(付けなくても detached)
タグから作業用のブランチを作る git switch -c hotfix v1.0 git checkout -b hotfix v1.0

git switch と git checkout の違い全体は、関連記事の「git switchとcheckoutの違い|切り替え・作成・restore」で扱っています。

ブランチに戻る(コミットしていないとき)

git switch main      # 戻るブランチを指定
git switch -         # 直前にいたブランチへ

コミットしていなければ、これで元どおりです。

detached HEAD のままコミットした(まだ移動していない)

git switch -c fix-v1      # 今の位置に新しいブランチを作り、そこに切り替える
Switched to a new branch 'fix-v1'

ブランチを作れば、detached HEAD が終わり、コミットはそのブランチに残ります。 git branch fix-v1 でも残せます(この場合、HEAD は detached のまま)。

コミットしたあと、ブランチに戻ってしまった

$ git switch main
Warning: you are leaving 1 commit behind, not connected to
any of your branches:

  ee76a30 fix on detached

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> ee76a30

ブランチに戻るとき、git は「1 commit を置いていく」と警告し、コミット ID(ee76a30)を表示しています。 この ID が分かれば、すぐに取り戻せます。

git branch rescue ee76a30

警告を見逃したとき:git reflog

git log --all には、置いていったコミットは出ませんでした(どのブランチからもたどれないため)。git reflog は、HEAD が動いた記録を残しているので、そこから探します。

$ git reflog
ffe6040 HEAD@{0}: checkout: moving from ee76a30f4d77638785eb82748171932d543bb7fc to main
ee76a30 HEAD@{1}: commit: fix on detached               ← これ
47177d9 HEAD@{2}: checkout: moving from main to v1.0     ← ここで detached になった
ffe6040 HEAD@{3}: commit: c3
git branch rescue ee76a30          # または git branch rescue 'HEAD@{1}'
git log --oneline -1 rescue
ee76a30 fix on detached

moving from main to v1.0 の行のあとにある commit: の行が、detached HEAD でしたコミットです。コミットのメッセージで探すなら、git log -g --oneline --grep=メッセージ でも見つかりました。

取り戻したら、git switch main → git merge rescue(または git cherry-pick ee76a30)で、元のブランチに取り込みます。

いつまで取り戻せるか

どのブランチからもたどれないコミットは、いずれ git のガベージコレクションで消えます(git 公式ドキュメント)。reflog から消えるまでの既定は、どこからもたどれない記録で 30 日(gc.reflogExpireUnreachable)です。

確認環境でも、reflog を消して git gc --prune=now を実行すると、ブランチを作っていなかったコミットは could not get object info となり、取り出せなくなりました。ブランチを作ったコミットは残りました。 見つけたら、すぐにブランチを作るのが確実です。

確認の手順(チェックリスト)

順番 確認すること 方法
1 detached HEAD か git status が HEAD detached at ...
2 この状態でコミットしたか git log --oneline -3
3 まだ移動していない git switch -c 新しいブランチ名
4 もう移動した 警告のコミット ID、または git reflog で探す
5 取り戻す git branch rescue コミットID
6 元のブランチに取り込む git merge rescue または git cherry-pick

よくある質問

Q. detached HEAD は直さないといけませんか。 A. タグの版を見る・ビルドする・試すだけなら、そのままで問題ありません。終わったら git switch - で戻ります。作業を残すつもりなら、最初に git switch -c でブランチを作ります。

Q. 毎回出る長い説明を消せますか。 A. メッセージの最後にあるとおり、git config advice.detachedHead false で表示されなくなります。

まとめ

  • detached HEAD は、ブランチではなくコミットを直接開いている状態。見るだけなら問題ない
  • 戻るだけなら git switch main(git switch - で直前のブランチへ)
  • この状態でコミットしたら、移動する前に git switch -c 新しいブランチ名
  • 移動したあとでも、git reflog でコミット ID を探し、git branch で取り戻せる
  • git switch は --detach が無いとタグ・リモートのブランチに切り替えないので、うっかり detached になりにくい
  • たどれないコミットは、いずれ消える。見つけたらすぐにブランチを作る

参考・出典

確認日はいずれも 2026年10月11日です。

  • Git Documentation「git-checkout」(DETACHED HEAD):https://git-scm.com/docs/git-checkout
  • Git Documentation「git-gc」:https://git-scm.com/docs/git-gc

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「detached HEADの戻し方|gitのコミットが消えたとき」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?