- Git
detached HEADの戻し方|gitのコミットが消えたとき
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期連続の黒字決算。