🐷
【Git】”Detached HEAD”を理解する
通常、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