[git] チルダ(~)とキャレット(^)の違い

チルダ ( ~ )

チルダ
  • HEAD˜ : HEADの親(1世代前)
  • HEAD˜˜ : HEADの親の親(2世代前)
  • HEAD˜2 : HEADの親の親(2世代前)

1番目の親を暗黙的に遡る。親が一つ(merge commitがない)のときはシンプルに指定できる。 HEAD˜˜HEAD˜2 は(記法の違いだけで)『同じコミット』を指す。チルダの直後に続く数字は遡る世代数を指定する。したがってチルダの後ろに続く数字は2以上の数が許される。

 

キャレット ( ^ )

キャレット
  • HEAD^ : HEADの1番目の親(1世代前)
  • HEAD^2 : HEADの2番目の親(1世代前)
  • HEAD^^ : HEADの1番目の親の1番目の親(2世代前)
  • HEAD^2^ : HEADの2番目の親の1番目の親(2世代前)
  • HEAD^2^2 : HEADの2番目の親の2番目の親(2世代前)

親コミットが2つ(merge commitがある)ときに区別できる。キャレットの直後に続く数字はマージコミットにおける1番目の親(first parent)か2番目の親(secound parent)かを指定するために使われる。したがってキャレットの直後に2を超える数字が続くことはない。HEAD^^HEAD^2 は世代もブランチも『異なるコミット』を指す。

 

1番目の親と2番目の親がある(merge commitがある)ときのgit logの例

36fc76d3ad88d7 の2つのコミット(ブランチ)を親にマージしている。

 

家系参照(Ancestry Reference)の例

系譜参照の例1

 

系譜参照の例2

 

キャレットとチルダを組み合わせた『異なる記述方法』が『同じコミット』を指すことがある。ただし、それは同じ家系(分岐とマージで作られるコミット歴史)を辿っているときに、たまたま同じコミットを指しているのであって『異なる記述』は『異なるコミット』を指すと考えるべきである。つまりはキャレットとチルダの記述方法の違いは臨機応変に使い分ける必要がある。

マージコミットが存在しなければ「チルダ」で記述しても「キャレット」で記述しても常に同じコミットを指定することになります。そしてマージコミットが存在しないにもかかわらず HEAD^2 のように2番目の親をしていする記述をするとエラーになります。マージコミットが存在しないときは、チルダとキャレットの使い分けに神経質になる必要はありません。マージコミットが存在しない、もしくは2番目の親を辿らないのであれば「チルダ」で記述を統一するのがシンプルな記述方法です。

 

Git 公式ドキュメント