detached HEADとは?状態の確認と元に戻す方法を解説

git
\ Gitがよく分からない初心者の方へ /
さわっておぼえるGit入門
Gitがよく分からない初心者でも、
この1冊で基本操作を一通り理解できます。
👉 Amazonで詳しく見る
Kindle Unlimitedなら無料で読めます
▶ 無料で読む(Kindle Unlimited)

今回は、Gitの「detached HEAD」について解説します。
Gitを使っていると、次のような状態になって困ったことはありませんか?

  • detached HEAD と表示された
  • ブランチがどこにも属していない
  • このまま作業していいのか不安
  • 元に戻す方法が分からない

結論から言うと、detached HEADは「ブランチに属さない状態」ということです。
正しく対処すれば問題なく元に戻せます。

この記事では、以下の内容を分かりやすく解説します。

  • detached HEADとは何か
  • 状態の確認方法
  • 元に戻す方法(安全な手順)
  • やってはいけない操作

detached HEADとは?

detached HEADとは、現在の作業位置(HEAD)がブランチではなく、特定のコミットを直接指している状態です。

通常、Gitは以下のように動きます。
ブランチを指していて、そこからコミットが積み重なります。

ブランチ → コミット → コミット → コミット
        ↑
       HEAD

しかし、detached HEADになるとこうなります。

コミット → コミット → コミット
                    ↑
                   HEAD(ブランチなし)

現在の場所として、ブランチを指さずにコミットを指しています。
つまり、「どのブランチにも属していない状態」です。

なぜdetached HEADになるのか?

「detached HEAD」になる主な原因は次の通りです。

特定のコミットをcheckoutしたとき

git checkout <commit-hash>

または

git switch --detach <commit-hash>

この操作をすると、そのコミットに直接移動するため、detached HEADになります。

過去のコミットを確認するとき

git checkout HEAD^ # またはHEAD~1

これも同様に、過去のコミットに移動するため発生します。

detached HEADの確認方法

現在の状態は、以下のコマンドで確認できます。

git status

すると、次のように表示されます。

HEAD detached at abc1234

または、ブランチを確認する下記のコマンドでも確認できます。

git branch

このように「HEAD detached」とブランチを指していないことが確認できます。

* (HEAD detached at abc1234)

detached HEADは危険?

「detached HEAD」は基本的には危険ではないが、そのまま作業すると危険です。
理由は、コミットしてもブランチに残らない可能性があるためです。

detached HEADの状態でコミットすると、「どのブランチにも属さない」状態になります。
そのため、このままmainブランチに戻るなどの操作をすると、コミットがブランチから参照されなくなり、見失ってしまう可能性があります。
(※reflogを使えば復元できる場合もあります)

detached HEADから元に戻す方法

detached HEADから元に戻す方法についてです。

① 何もしていない場合(安全)

git checkoutなどで、「detached HEAD」になったとき
特に何もしていない場合は、単純に元のブランチに戻るだけでOKです。

git switch main

または

git checkout main

② 変更・コミットしてしまった場合

変更やコミットをした場合には注意が必要です。
このときは、新しいブランチを作成して退避するのが安全です。

git switch -c new-branch

または

git checkout -b new-branch

このようにすると、new-branchブランチが新しくつくられて、そこに退避した内容が残ります。
mainブランチに移動しても、new-branchブランチに残っているので安全です。

③ 元の場所に戻りたい場合

何も変更やコミットをしていないとき
直前のブランチに戻るなら、下記のコマンドを使用するのが一番簡単です。

git switch -

やってはいけない操作

detached HEADのときにやりがちなNG行動です。

❌ そのまま作業を続ける

コミットが消える可能性あるので、ブランチを新しく作成するか、元のブランチにもどりましょう。

❌ 状態を理解せずにブランチ移動

コミットを既にしてしまっている場合、「detached HEAD」の状態から移動しようとすると消える可能性があります。
新しいブランチをつくって退避するようにしましょう。

detached HEADを防ぐには?

基本的には以下を意識すればOKです。

  • コミットハッシュでcheckoutしない
  • 作業前にブランチを確認する
git branch

開発時にはブランチを切り替えて作っていくことが多いかと思います。
毎回ブランチを作成して、作業する前に確認するようにしましょう。

detached HEADはどんなときに使う?

detached HEADは基本的には通常の開発ではあまり使いませんが、
以下のような場面で一時的に利用されることがあります。

  • 過去のコミットの内容を確認したいとき
  • 特定の状態で動作確認をしたいとき

このような場合は、一時的に利用するだけに留めて
作業をする場合は必ずブランチを作成するようにしましょう。

見失ったコミットを復元する方法(reflog)

detached HEADの状態でコミットしてしまい、
どこに行ったか分からなくなった場合でも、git reflogを使うことで履歴を確認できます。

git reflog

過去のHEADの移動履歴が表示されるので、
対象のコミットを見つけてブランチを作成すれば復元できます。

git switch -c restore-branch <commit-hash>

reflogはローカルの履歴が残っている限り復元できるため、
万が一の場合でも焦らず対応することが可能です。

まとめ

今回はgitの「detached HEAD」について確認していきました。
内容をまとめると、下記になります。

  • detached HEAD = ブランチに属していない状態
  • 主な原因は「過去のコミットへの移動」
  • そのまま作業するとコミットを見失う可能性あり

解決方法は以下の2つです。

  • ブランチに戻る → git switch main
  • 作業を残す → git switch -c new-branch

detached HEADになった場合には、焦らずブランチ移動すればOKです。
基本的には簡単に元に戻せる状態なので、落ち着いて対応しましょう。

すでに作業をコミットした場合には、新規ブランチを作成して退避するようにしましょう。

コメント