この記事では『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~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^^1
orHEAD^1^1
- 「
HEAD
の1番目の親(HEAD^
orHEAD^1
)」の1番目の親を指定している(C1
)。 - 「
HEAD
の1番目の親(HEAD^
orHEAD^1
)」に^
または^1
を付けている。
- 「
HEADの後ろにある^(キャレット)について
HEAD
の後ろに^
(キャレット)を付けた場合、マージコミット等で親コミットが複数ある場合に、どの親コミットかを指定することができます。
実際に以下の図で説明します。
HEAD^
orHEAD^1
HEAD
の1番目の親を指定している(C2
)。HEAD
に^
または^1
を付けている。
HEAD^2
HEAD
の2番目の親を指定している(C5
)。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~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~^1
orHEAD~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
の後ろにある^
(キャレット)について
お読み頂きありがとうございました。