【Git】HEAD~~, HEAD^^, アットマーク@~(チルダ), @^(キャレット)とは何か?意味や違いを実例で解説|指定したコミットやログ履歴を参照する方法

git-prograshi(プロぐらし)-kv git/github
記事内に広告が含まれていることがあります。
[PR]

GitではGitのコードの履歴を参照するときに、過去のコミットの内容を参照したい場合があります。

そのときに、次のような表記を見かけることがあると思います。

Git履歴の参照でよく見かけるコードの例
  • HEAD~, HEAD~~, HEAD~~~~, HEAD~~~~~,,,,
  • HEAD^, HEAD^^, HEAD^^^^, HEAD^^^^^,,,,
  • @, @~, @~~, @~~~, @~~~~, @~~~~~,,,,
  • @^, @^^, @^^^, @^^^^, @^^^^^,,,,

例えば、git show @^^といった使われ方をします。

ここでは、これらのHEADや@(アットマーク)、後ろの^(キャレット)や~(チルダ)の意味について解説しています。


HEADとは何か?

まず最も基本になるのが「HEAD」という表記です。

GitにおけるHEADとは現在のブランチが指している最新のコミットのことです。

例えば、git logを一行で表示する「–oneline」オプションを使ってコミット履歴を表示すると次のようになります。

$ git log --oneline
0adba46 (HEAD -> test, origin/main, main) [F]edit class name
b80abcb [A]test Components UserDetail

すると、2行目にHEAD -> testと表示されているのがわかります。

これは、現在testブランチにいて、最新のコミットはココ(コミット番号:0adba46、コミットメッセージ:[F]edit class name)であることを示しています。


@とは何か?

続いて「@(アットマーク)」とは何かについてです。

Gitでよく出てくる@はHEADの別名(エイリアス)です。つまり、@ 」= 「HEADという認識で問題ありません。

HEADは4文字もあり、頻繁に使用するにも関わらず毎回入力するのが大変です。これをもっと簡単に1文字で書けるようにしたのが「@」です。


実例

例えば、以下のようなコミット履歴があるとします。

$ git log --oneline
d21e8bf (HEAD -> master) nested resources products & reviews
48c84c8 [A]scaffold User
2356c72 [F]routes.rb resources
27b11b1 [A]names_controller
8c153ae [A]Usersコントローラ
32d2ced [F]development.rb FileUpdateChecker
3219db6 [F]database名 in database.yml
9b12aaa [F]rails-testに統一
9ef4168 [D]delelte Users model
5ed12c6 [A]migration files

最新のコミット履歴を指定したい場合は「HEAD」か「@」を使います。


HEADを使った場合

$ git show HEAD
commit d21e8bf7e651b2e88b0680ed570b3ae7057b4c41 (HEAD -> master)
Author: author name <test@example.com>
Date:   Sun Aug 1 17:57:39 2021 +0900

    nested resources products & reviews

現在のブランチのHEADが指しているコミット「d21e8bf (HEAD -> master) nested resources products & reviews」の内容が表示されました。


@を使った場合

$ git show @
commit d21e8bf7e651b2e88b0680ed570b3ae7057b4c41 (HEAD -> master)
Author: author name <test@example.com>
Date:   Sun Aug 1 17:57:39 2021 +0900

    nested resources products & reviews

「@」で指定しても「HEAD」と全く同じ内容が表示されているのがわかります。

point

打ち込むコードの量を少なくするために、「@」を使うのが一般的です。


^(キャレット)や~(チルダ)とは何か?

HEADと@は全く同じものだということがわかったので、次はHEADや@の後ろについている、^(キャレット)や~(チルダ)について解説します。

まずはじめに覚えておくべきことは、「^(キャレット)」と「~(チルダ)」の内容同じということです。

つまり、「HEAD^」=「HEAD~」=「@^」=「@~」ということです。

何個も同じ記述があってわかりにくいかもしれませんが、より柔軟に考えれば、どっちを使ってもいいということです。

一番大事な「^(キャレット)」と「~(チルダ)」の意味は何かというと、履歴を何個遡るかという数を表しています。

例えば、「^」が1つであれば、1つ前の履歴を参照する。

「^^」のように^が2つあれば2つ前の履歴を参照する。

「^^^」のように^が3つあれば3つ前の履歴を参照する。

「^^^^」のように^が4つあれば4つ前の履歴を参照する。(以下同じ)

ということです。


同様に、「~」が1つであれば、1つ前の履歴を参照する。

「~~」のように~が2つあれば2つ前の履歴を参照する。

「~~~」のように~が3つあれば3つ前の履歴を参照する。

「~~~~」のように~が4つあれば4つ前の履歴を参照する。(以下同じ)


^と~の実例

実際に^と~を使うことで、どのようにコミット履歴を指定できるのかの例を紹介します。

例えば、以下のようなコミット履歴があるとします。

$ git log --oneline
d21e8bf (HEAD -> master) nested resources products & reviews
48c84c8 [A]scaffold User
2356c72 [F]routes.rb resources
27b11b1 [A]names_controller
8c153ae [A]Usersコントローラ
32d2ced [F]development.rb FileUpdateChecker
3219db6 [F]database名 in database.yml
9b12aaa [F]rails-testに統一
9ef4168 [D]delelte Users model
5ed12c6 [A]migration files


1つ前のコミット履歴を参照する

1つ前のコミット履歴を指定したい場合は「@^」か「@~」を使います。(@をHEADに変えても同じ処理になります)

@^を使った場合

$ git show @^
commit 48c84c88e8875a2321cc2ff8f6597caa288f8ab3
Author: author name <test@example.com>
Date:   Fri Jul 30 13:29:44 2021 +0900

    [A]scaffold User

現在のブランチ(HEAD)が指している1つ前のコミット48c84c8の内容が表示されました。


@~を使った場合

$ git show @~
commit 48c84c88e8875a2321cc2ff8f6597caa288f8ab3
Author: author name <test@example.com>
Date:   Fri Jul 30 13:29:44 2021 +0900

    [A]scaffold User

「@~」で指定しても「@^」と全く同じ内容が表示されているのがわかります。


3つ前のコミット履歴を参照する

3つ前のコミット履歴を指定したい場合は「@^^^」か「@~~~」を使います。 (@をHEADに変えても同じ処理になります)

@^^^を使った場合

$ git show @^^^
commit 27b11b1e8a7cf350cbcd328a430059fa5b14f1fc
Author: author name <test@example.com>
Date:   Thu Jul 29 06:48:09 2021 +0900

    [A]names_controller

現在のブランチ(HEAD)が指している3つ前のコミット「27b11b1 [A]names_controller」の内容が表示されました。


@~~~を使った場合

$ git show @^^^
commit 27b11b1e8a7cf350cbcd328a430059fa5b14f1fc
Author: author name <test@example.com>
Date:   Thu Jul 29 06:48:09 2021 +0900

    [A]names_controller

「@~~~」で指定しても「@^^^」と全く同じ内容が表示されているのがわかります。

遡りたいコミットの数だけ「^」か「~」をつけるだけです。


(参考)コミット履歴の指定方法一覧

例えば、下記のようにc1〜c4まで順番に行った4つのコミットがあるとします。現在作業中のコミットがc4の場合の各コミットは以下のように参照できます。

c1 -> c2 -> c3 -> c4(HEAD)
c1c2c3c4
3つ前2つ前一つ前現在作業中
HEAD^^^HEAD^^HEAD^HEAD
HEAD~~~HEAD~~HEAD~HEAD
@^^^@^^@^@
@~~~@~~@~@
タイトルとURLをコピーしました