GitではGitのコードの履歴を参照するときに、過去のコミットの内容を参照したい場合があります。
そのときに、次のような表記を見かけることがあると思います。
例えば、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」と全く同じ内容が表示されているのがわかります。
^(キャレット)や~(チルダ)とは何か?
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)
c1 | c2 | c3 | c4 |
---|---|---|---|
3つ前 | 2つ前 | 一つ前 | 現在作業中 |
HEAD^^^ | HEAD^^ | HEAD^ | HEAD |
HEAD~~~ | HEAD~~ | HEAD~ | HEAD |
@^^^ | @^^ | @^ | @ |
@~~~ | @~~ | @~ | @ |