HOWTO · Git
Git HEAD^ vs Git HEAD~ vs Git HEAD{@}
この記事では、Git キャレットと Git チルダの違いについて説明します。
この記事では、Git キャレットと Git チルダの違いについて説明します。Git キャレットは^で表され、チルダは~で表されます。
HEAD{@} についても説明します。はじめましょう。
Git HEAD^(キャレット)
Git HEAD にキャレットを導入するときは、コミットの最初の親を指します。したがって、git HEAD^2 はコミットの 2 番目の親を指します。
コミットの親とは何ですか?
1つ以上のブランチを別のブランチとマージすると、コミットの親が機能します。例を見てみましょう。
私たちのリポジトリには、緑色の master ブランチと黄色の other-branch ブランチがあります。

other-branch のコミット E は、master ブランチのコミット A とマージされます。したがって、コミット A には 2つの親コミットがあると言えます。
したがって、親コミットは単にコミットの前のコミットです。
以下のコマンドを見てください。
$ git show HEAD^ --oneline
上記のコマンドを実行すると、コミット A の場合、コミット B で HEAD が移動します。
$ git show HEAD^2 --oneline
一方、上記のコマンドは、HEAD をシフトして E をコミットします。
HEAD^と HEAD^1 は同じ目的を果たすことに注意してください。
上記の説明は、ブランチをマージした場合にのみ適用されることに注意してください。1つのブランチで作業している場合、HEAD^は HEAD^と同等になります。
Git HEAD~(チルダ)
HEAD にチルダを追加すると、ブランチの最後のコミットの前のコミットがポイントされます。まっすぐ戻るようなものです。
例を見てみましょう。

したがって、HEAD がコミット A にある場合、git HEAD~または git HEAD~1 は、B をコミットするようにシフトします。HEAD~2 は、C をコミットするようにシフトします。
other-branch のコミット E でチェックアウトされた場合、HEAD~1 はコミット F などにシフトします。
Git HEAD{@}
この組み合わせは、ローカルリポジトリ内の特定の時点での参照の位置を示します。以下に示すように、通常、git reflog コマンドを実行するとポップアップします。

一言で言えば、他のブランチのブランチをマージするときにキャレットが役立ち、別のブランチのコミットに切り替える必要があります。チルダを使用すると、特定のブランチの最後のコミットの前のコミットにシフトできます。
単一のブランチで作業する場合、HEAD^は HEAD~と同じです。