この記事では『GitのHEAD』について、
- Gitの
HEADとはHEADが先頭のコミットを指さない例
- Gitの
HEAD~やHEAD^とは HEAD^とHEAD~の違いHEADの後ろにある~(チルダ)についてHEADの後ろにある^(キャレット)について
などを図を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。
GitのHEADとは

GitのHEADは、自分が現在いるブランチの位置です(正確には現在いるブランチの位置を指し示すポインタです)。HEADはブランチの先頭のコミットを指していることが多いです。
例えば、masterブランチにチェックアウトしている場合、HEADはmasterブランチの先頭コミット(C5)を指します。
なお、Gitのv1.8.5からは、HEADのエイリアスとして@が用意されているため、HEADは@でも表現できます(HEAD = @)。
HEADが先頭のコミットを指さない例
HEADはブランチの先頭のコミットを指していることが多いですが、git checkout <コミットID>を実行した場合には、最新のコミットを示しません。例えば、以下のようなブランチにおいて、git checkout C3を実行すると、ブランチの先頭のコミットはC5になりますが、HEADはC3になります。

GitのHEAD~やHEAD^とは

HEADや@に~や^をつけると、過去のコミットを表します。
例えば、HEAD~やHEAD^は、1つ前のコミットを指します。HEAD~~やHEAD^^は、2つ前のコミットを指します。
同様に、10つ前のコミットを表すためには、~(チルダ)や^(キャレット)を10個書いてHEAD~~~~~~~~~~やHEAD^^^^^^^^^^と書くことができますが、HEAD~10のように書くこともできます(HEAD^10は違う意味になります。後ほど詳しく説明します)。
今までの内容をまとめると以下のようになります。
HEADと@- 自分が現在いるブランチの位置。ブランチの先頭のコミットを指していることが多い。
HEAD^(または@^)やHEAD~(または@~)- 1つ前のコミットを指します。
HEAD~{n}や@~{n}- nつ前のコミットを指します。
HEAD^^やHEAD~~はHEAD~2や@~2と同じ意味です。
HEAD^とHEAD~の違い
マージコミットがある場合にHEAD^とHEAD~が指すコミットが異なります。
HEADの後ろに~(チルダ)を付けた場合、何個前のコミットかを指定することができます。
HEADの後ろに^(キャレット)を付けた場合、マージコミット等で親コミットが複数ある場合に、どの親コミットかを指定することができます。
ではこれから、HEADの後ろにある~(チルダ)と^(キャレット)について順番に図を用いて詳しく説明します。
HEADの後ろにある~(チルダ)について
HEADの後ろに~(チルダ)を付けた場合、何個前のコミットかを指定することができます。
実際に以下の図で説明します。

HEAD~orHEAD~1HEADの1つ前のコミットを指定している(C2)。HEADに~または~1を付けている。
HEAD~~orHEAD~2HEADの2つ前のコミットを指定している(C1)。HEADに~~または~2を付けている。
ちなみに、^(キャレット)は以下の箇所を指定しています。
HEAD^orHEAD^1HEADの1番目の親を指定している(C2)。HEADに^または^1を付けている。
HEAD^^orHEAD^1^orHEAD^^1orHEAD^1^1- 「
HEADの1番目の親(HEAD^orHEAD^1)」の1番目の親を指定している(C1)。 - 「
HEADの1番目の親(HEAD^orHEAD^1)」に^または^1を付けている。
- 「
HEADの後ろにある^(キャレット)について
HEADの後ろに^(キャレット)を付けた場合、マージコミット等で親コミットが複数ある場合に、どの親コミットかを指定することができます。
実際に以下の図で説明します。

HEAD^orHEAD^1HEADの1番目の親を指定している(C2)。HEADに^または^1を付けている。
HEAD^2HEADの2番目の親を指定している(C5)。HEADに^2を付けている。
HEAD^^orHEAD^^1orHEAD^1^orHEAD^1^1- 「
HEADの1番目の親(HEAD^orHEAD^1)」の1番目の親を指定している(C1)。 - 「
HEADの1番目の親(HEAD^orHEAD^1)」に^または^1を付けている。
- 「
HEAD^2^orHEAD^2^1- 「
HEADの2番目の親(HEAD^2)」の1番目の親を指定している(C4)。 - 「
HEADの2番目の親(HEAD^2)」に^または^1を付けている。
- 「
ちなみに、~(チルダ)は以下の箇所を指定しています。
HEAD~orHEAD~1HEADの1つ前のコミットを指定している(C2)。HEADに~または~1を付けている。
HEAD~~orHEAD~2HEADの2つ前のコミットを指定している(C1)。HEADに~~または~2を付けている。
HEAD^~orHEAD^1~orHEAD^1~orHEAD^1~1- 「
HEADの1番目の親(HEAD^orHEAD^1)」の1つ前のコミットを指定している(C1)。 - 「
HEADの1番目の親(HEAD^orHEAD^1)」に~または~1を付けている。
- 「
HEAD^2~orHEAD^2~1- 「
HEADの2番目の親(HEAD^2)」の1つ前のコミットを指定している(C4)。 - 「
HEADの2番目の親(HEAD^2)」に~または~1を付けている。
- 「
HEAD~^orHEAD~^1orHEAD~1^orHEAD~1^1- 「
HEADの1代目前のコミット(HEAD~orHEAD~1)」の1番目の親を指定している(C1)。 - 「
HEADの1代目前のコミット(HEAD~orHEAD~1)」に^または^1を付けている。
- 「
HEAD^^とHEAD^2は違うコミットを指すので注意が必要です。HEAD~~とHEAD~2は同じコミットを指します。
本記事のまとめ
この記事では『GitのHEAD』について、以下の内容を説明しました。
- Gitの
HEADとはHEADが先頭のコミットを指さない例
- Gitの
HEAD~やHEAD^とは HEAD^とHEAD~の違いHEADの後ろにある~(チルダ)についてHEADの後ろにある^(キャレット)について
お読み頂きありがとうございました。