🐷

【Git】”Detached HEAD”を理解する

2024/09/26に公開

通常、Gitでは「HEAD」は現在作業しているブランチの最新のコミットを指しています。
しかし、特定のコミットやタグに直接チェックアウトgit checkout <commit-hash>すると、HEADがブランチではなく、そのコミット自体を直接指すようになります。
これが「Detached HEAD」状態です。

先に結論(※以下を踏まえ、私の理解)

結局、作業branchがない状態で、git checkout <作業ブランチと思って入力>して切り替えたつもりでも、それは切替後のbranchではなく、コミット自体を直接指す操作をしているので、どこのbranchにも属さないコミットなって、下記「注意」のようになってしまうよ。と解釈しました。
※間違っていたらご指摘ください。

発生する状況:

  • 特定のコミットハッシュを指定してチェックアウトした場合
  • タグをチェックアウトした場合
  • リモートブランチを直接チェックアウトした場合

この状態での作業:

通常通りファイルの変更、ステージング、コミットが可能です。
新しいコミットを作成すると、それは既存のブランチには属さない独立したコミットになります。

注意:

  • 新しく作成したコミットは、別のブランチにチェックアウトすると「見えなく」なる。
  • これらのコミットは、Gitのガベージコレクション(ストレージ空間を最適化するプロセス)によって最終的に削除される可能性がある。

対処方法:

新しいブランチを作成して作業を続ける:

Copygit switch -c new-branch-name

既存のブランチに戻る:

Copygit switch existing-branch-name

有用な使用例:

  • 過去の特定のコミットの状態を確認したい場合
  • 一時的な実験や変更を行いたい場合

まとめ

  • 「Detached HEAD」状態は、特定の目的には有用ですが、通常の開発作業では、上記「注意」になってしまう場合もあるので、個人的には避けたい。
  • 新しい変更を行う場合は、必ず適切なブランチ上で作業する。

Discussion