【やっとわかった!】gitのHEAD^とHEAD~の違い


20190502追記

  • わかりにくい表現を修正しました
  • 「おまけ」を追加しました

追記ここまで

そもそもHEADとは

現在チェックアウトしているブランチの先頭を指す。
ブランチの切り替えという動作は、「HEADの移動+ワークスペースのファイルの更新」で成り立っています。
詳しくはこちらを参照ください。→ Git のブランチ機能 - ブランチとは

~ (チルダ)

~世代前のコミットを指定できる。

^ (キャレット)

複数ある親コミットのなかからコミットを指定できる。

絵にしてみる

チルダ


チルダ指定をすることで、コミットをさかのぼって指定ができます。
HEAD~と指定することで、HEADに対して1世代前のコミットを指定でき、HEAD~~と指定することでHEADの2世代前のコミットを指定できます。

キャレット

キャレット指定をすることで、複数親がいる場合に、親コミットを指定できます。
複数親がいる状況は、2つのコミットをマージしたときに起きます。
HEAD^と指定することで一つ目の親を指定でき、HEAD^2と指定することで2つ目の親を指定できます。

HEAD~~とHEAD~2は同じだけど、HEAD^^とHEAD^2は違う

HEAD~~とHEAD~2は同じコミットを指しますが、HEAD^^とHEAD^2はそれぞれ違うコミットを指します。

HEAD^2はHEADの2つ目の親を指しますが、HEAD^^はHEADの一つ目の親の一つ目の親を指します。
一方、HEAD~~とHEAD~2はどちらもHEADの2世代前のコミットを指します。

おまけ

右上付き文字を書けなくて、「HEAD~」と表していたんですが、ちゃんと「HEAD~」と書けるようになりました!
以下のように書くことで、右上付き文字が書けます。

HEAD<sup>~</sup>

参考:http://danpansa.blog.jp/archives/21332987.html

ただし、以下の2点がこの表記だとうまくいきません。

  • 記事のタイトル(タイトルはHEAD~のままです)
  • 見出し中で「~~」を右上付き文字しようとしたらうまくいきませんでした。いったん「~ ~」のように間にスペースを入れた状態で保存して、その後スペースを消したらなぜかうまくいきました