GitのHEADとは?HEAD~とHEAD^の違いなどを図で分かりやすく解説!

この記事では『GitのHEAD』について、

  • GitのHEADとは
    • HEADが先頭のコミットを指さない例
  • GitのHEAD~HEAD^とは
  • HEAD^HEAD~の違い
    • HEADの後ろにある~(チルダ)について
    • HEADの後ろにある^(キャレット)について

などを図を用いて分かりやすく説明するように心掛けています。ご参考になれば幸いです。

GitのHEADとは

GitのHEADとは

GitのHEADは、自分が現在いるブランチの位置です(正確には現在いるブランチの位置を指し示すポインタです)HEADはブランチの先頭のコミットを指していることが多いです。

例えば、masterブランチにチェックアウトしている場合、HEADmasterブランチの先頭コミット(C5)を指します。

なお、Gitのv1.8.5からは、HEADのエイリアスとして@が用意されているため、HEAD@でも表現できます(HEAD = @)。

HEADが先頭のコミットを指さない例

HEADはブランチの先頭のコミットを指していることが多いですが、git checkout <コミットID>を実行した場合には、最新のコミットを示しません。例えば、以下のようなブランチにおいて、git checkout C3を実行すると、ブランチの先頭のコミットはC5になりますが、HEADC3になります。

HEADが先頭のコミットを指さない例

GitのHEAD~やHEAD^とは

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の後ろにある~(チルダ)について
  • HEAD~orHEAD~1
    • HEADの1つ前のコミットを指定している(C2)。
    • HEAD~または~1を付けている。
  • HEAD~~orHEAD~2
    • HEADの2つ前のコミットを指定している(C1)。
    • HEAD~~または~2を付けている。

ちなみに、^(キャレット)は以下の箇所を指定しています。

  • HEAD^orHEAD^1
    • HEADの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の後ろにある^(キャレット)について
  • HEAD^orHEAD^1
    • HEADの1番目の親を指定している(C2)。
    • HEAD^または^1を付けている。
  • HEAD^2
    • HEADの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~1
    • HEADの1つ前のコミットを指定している(C2)。
    • HEAD~または~1を付けている。
  • HEAD~~orHEAD~2
    • HEADの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の後ろにある^(キャレット)について

お読み頂きありがとうございました。