HEADとは?
今自分が作業をしているブランチの最新のコミットを示すポインタで、通常はどこかのブランチにくっついています。逆に言えば、GitはHEADのおかげで今の作業ブランチを把握しています。
ブランチを変更したらHEADの位置も変更したブランチに切り替わります。
git log
現在のHEADの位置を確認できます。なお、SourceTreeなどのGitのGUIツールを使えば視覚的に複数ブランチのコミット状態やHEADの位置などを確認できますので使用を検討しても良いかもしれません。
git reflog
直近で自分が移動したHEADの位置を確認することができます。
HEADの中身
リポジトリ(.gitディレクトリ)の中(.git/HEAD)に記録されています。
中身に関して言えば、例えば現在testブランチで作業をしている場合のHEADの中身は「ref:test」(testブランチを参照しているという意味)という情報を保持しているだけで非常にシンプルなものとなります。
origin/HEAD
リモートリポジトリ(GitHubなど)のHEADをローカルリポジトリにコピーしたもののことです。なお、基本使わないのでこれはどの位置にあっても問題ないですし開発者が特段意識する必要もないです。
そのリモートリポジトリのデフォルトのブランチを表します。最初はmasterだけがデフォルトブランチとして作られるのでmasterに存在することになります。
detached HEAD状態
HEADのポインタがブランチではなく直接任意のコミットを指しており、どのブランチにも所属しない無所属になった状態です。(本来コミットの場所を記録するのはHEADではなくブランチという存在のはずなので役割が異なってしまうことになります。)
発生させるには?
- コミットのハッシュIDか最新のコミット(HEAD^0)を指定してチェックアウトしてしまう。(直接コミットを指すように仕向けるため)
対処
そうなった場合でも慌てずに新規ブランチを作れば新しいブランチのHEADとして再認識されるようになり「detached HEAD状態」は解消されます。
また、もし元のブランチが消えていないのであれば「git checkout 元いたブランチ」と指定することでも対処することは可能です。ただ、もし消えてしまった状態で別ブランチに移動するとコミット内容は消えてしまうので注意です。
この記事へのコメントはありません。