ユーザーが作業するブランチを指すHEAD
複数の「ブランチ」が存在する場合、ユーザーはいずれかの「ブランチ」で作業を行います。同時に複数の「ブランチ」で作業することはありません。
別の「ブランチ」で作業を行いたければ、別の「ブランチ」に切り替える必要があります。
この時、ユーザーがどの「ブランチ」で作業しているのかを、「HEAD」ポインターで管理します。
「HEAD」は、現在作業を行っている「ブランチ」の「ブランチヘッド」を指します。
「ブランチヘッド」は「ブランチ」ごとに存在するため、「ブランチヘッド」からどの「ブランチ」なのかを把握することができます。
現在のブランチ
「HEAD」が指す「ブランチ」を、「現在のブランチ(current branch)」と表現します。作業するブランチの変更
ユーザーは作業する「ブランチ」を、別の「ブランチ」に切り替えることができます。「ブランチ」を切り替えれば、その「ブランチ」が操作対象になります。
この時、「HEAD」が指す「ブランチヘッド」は、切り替えた「ブランチ」の「ブランチヘッド」を指します。
間接的にコミットオブジェクトも指す
「HEAD」は「ブランチヘッド」を指しますが、「ブランチヘッド」が「コミットオブジェクト」を指すため、「HEAD」から「ブランチヘッド」を経由して「コミットオブジェクト」にアクセスすることができます。「HEAD」は、作業対象の「ブランチ」を指すと同時に、操作対象の「コミットオブジェクト」も指しています。
「HEAD」は、「コミットオブジェクト」へのポインターへのポインター、と言ったところでしょうか。
HEADは多用される
「Git」で何か操作を行う際、操作対象に「コミットオブジェクト」を指定する機会が数多くあります。多くのケースではデフォルトの操作対象として、「HEAD」が(間接的に)指す「コミットオブジェクト」を対象にします。
コミットオブジェクトを指す分離されたHEADについて
「HEAD」は、通常上記のように「ブランチヘッド」を指します。しかしユーザーの操作内容によっては、特定の「コミットオブジェクト」を指すこともあります。
この時「HEAD」は、どの「ブランチヘッド」も指していません。
従って、「現在のブランチ」は存在しないことになります。
このように、直接「コミットオブジェクト」を指す「HEAD」のことを、「分離されたHEAD(detached HEAD)」と表現します。
どの「ブランチ」からも切り離されているため、「分離」となります。
過去のスナップショットの参照
「分離されたHEAD」の例です。過去の「スナップショット」からプロジェクトのファイル群を取得した時は、「HEAD」はその「コミットオブジェクト」を指すようになります。
「HEAD」が指す「コミットオブジェクト」から、「ブランチ」を作成することができます。
作成したブランチで「コミット」を行えば、以下のように履歴が枝分かれします。