detached HEAD とは?焦らず対処する方法
detached HEAD の意味・原因・復帰方法と、コミットを救出する手順
detached HEAD とは何か
通常、HEAD(ヘッド)はブランチを指しており、コミットすると HEAD が指すブランチが進みます。
detached HEAD(デタッチド・ヘッド)は、HEAD がブランチではなく特定のコミットを直接指している状態です。
データが壊れているわけではなく、単に「ブランチから外れている」だけです。
detached HEAD になる原因
コミットハッシュやタグを直接 checkout
git checkout abc1234やgit checkout v1.0.0のように特定の位置を指定すると detached HEAD になります。リモートブランチを直接 checkout
git checkout origin/mainのようにリモート追跡ブランチを直接指定した場合も detached HEAD になります。git bisectの実行中bisect は各コミットを順に detached HEAD でチェックアウトしながら検証します。
いずれも意図的に過去のコミットを確認する操作で起こるもので、異常ではありません。
ブランチに戻る方法
detached HEAD の状態から元のブランチに戻るには、git switch でブランチ名を指定します。
detached HEAD の状態で何も変更やコミットをしていなければ、これだけで解決です。
# main ブランチに戻る
git switch main
# 直前にいたブランチに戻る
git switch -detached HEAD でコミットしてしまった場合
現在位置に新しいブランチを作成
git switch -c rescue-branchで detached HEAD の位置を指すブランチを作ります。これでコミットが孤立する心配がなくなります。必要に応じて main などにマージ
git switch mainしてからgit merge rescue-branchを実行して統合します。不要なら rescue ブランチは後で削除しても構いません。
# 現在の位置で新しいブランチを作成
git switch -c rescue-branch
# 必要に応じて main にマージ
git switch main
git merge rescue-branch
Git Ready