Gitの履歴を確認するコマンドにgit log
コマンドがあります。
git logには「--decorate
」オプションがあります。この「–decorate」が何をしているかについてまとめています。
–decorateは不要
結論から言うと、–decorateオプションをつける必要はありません。
Gitのバージョン2.12.2以降は git log
コマンドに、git log --decorate=auto
がデフォルトでつく使用となりました。
このため、–decorateをつけても、つけなくても全く同じ結果が返ってきます。
もし、–decorateの記述を見かけたら、過去の古い記事やコードを参照しているためだと思われます。
なお、decorateでも表示指定でdecorate=full
を指定すれば、デフォルトのgit logとは異なる表示になります。
詳細については下部の「–decorateの表示指定」セクションで解説しています。
Gitのバージョンによる結果の違い
例えばGitのバージョン v1.8.3でgit logを実行すると以下のようになります。
$ git log
commit 0b57f44b3371521f65eb7607310803c7e90dc023
一方、Gitのバージョンv2.24.3だと以下のようになります。
$ git log
commit 0b57f44b3371521f65eb7607310803c7e90dc023 (HEAD -> master, origin/master)
–decorateオプションとは何か?
そもそも–decorateオプションとは、参照名(ref name)を表示するオプションです(でした)。
参照名(ref name)とは何か?
例えばgit log --oneline
を実行すると以下のようにコミット履歴が表示されます。(–onelineオプションはコミット履歴を一行ずつ表示するオプションです。)
$ git log --oneline
0adba46 (HEAD -> main, origin/main) [F]edit class name
b80abcb (test) [A]test Components UserDetail
参照名(ref name)とは、コミットのハッシュ値の後ろに表示されるカッコで囲まれた部分のことです。
(HEAD -> main, origin/main)
(test)
参照名は、各ローカルブランチがどのコミット履歴を指しているか、ローカルと紐づけた各リモートレポジトリのコミット履歴がどこを指しているか、現在のブランチはどのコミットにいるかを示しています。
実際の開発でも多用する非常に重要な情報です。
主要な参照名の意味(HEAD、main、origin/main)
以下の参照名には大きく分けて「HEAD->」「main」「origin/main」「test」の4つがあります。
$ git log --oneline
0adba46 (HEAD -> main, origin/main) [F]edit class name
b80abcb (test) [A]test Components UserDetail
HEAD->
「HEAD->」は現在のコミット履歴を参照しているブランチがどこかを表しています。HEAD -> main
は、現在のブランチが「main」にいることを示しています。
origin/main
「origin/main」はリモートに同期したリモートレポジトリ名originのmainブランチの最新のコミットの場所を指しています。(「リモートレポジトリ名/ブランチ名」と対応しています)
「リモートに同期した」というのが分かりにくいかもしれないので、追加で解説します。
リモートレポジトリはGithub上に存在します。リモートレポジトリのコミット履歴をローカルレポジトリに取り込んだときに、「リモートレポジトリ名/ブランチ名」のコミット履歴が更新されます。
このため、自分以外の他の人が該当するGithub上のリモートレポジトリのコミット履歴を前に進めた場合、ローカルの「リモートレポジトリ名/ブランチ名」が指す最新のコミット番号は、Github上のリモートレポジトリとずれます。
もし、ローカルレポジトリに同期しているリモートレポジトリの状態を最新に更新したい場合は「git fetch」を実行してください。
test
2つ目のコミット履歴の参照名は「test」になっています。
これはローカルレポジトリの「test」ブランチは、このコミット履歴にいますよということです。
testブランチがmainブランチのコミット履歴を取り込めば、「test」は「main」や「origin/main」と同じ場所に来ます。
実際にtestブランチに移動して、mainブランチの内容を取り込むと以下のようになります。
#testブランチに移動
$ git checkout test
Switched to branch 'test'
#mainブランチのコミット履歴を取り込む
$ git rebase main
Successfully rebased and updated refs/heads/test.
#コミット履歴を表示
$ git log --oneline
0adba46 (HEAD -> test, origin/main, main) [F]edit class name
b80abcb [A]test Components UserDetail
(HEAD -> test, origin/main, main)
と表示され、「test」が「main」や「origin/main」と同じ場所に来ていることがわかります。
なお、現在はtestブランチにいるので、「HEAD->」は「test」を指しています。
–decorateの表示指定
–decorateが完全に無意味になったわけではなく、いくつかの表示方法の指定があります。
--decorate=表示指定
表示指定の内容
表示指定にはauto, short, full, noの4つがあります。
表示指定 | 内容 | 実例 |
---|---|---|
auto | ターミナルの時のみshortで表示。それ以外は表示しない(noとする) | (HEAD -> master, origin2/master) or 表示なし |
short | 接頭辞(refs/heads/、refs/tags/、refs/remotes/)なしで表示 | (HEAD -> master, origin2/master) |
full | 接頭辞ありで表示 | (HEAD -> refs/heads/master, refs/remotes/origin2/master) |
no | 参照名を表示しない | なし |
接頭辞について
shortとfullで接頭辞の表示・省略が切り替わります。接頭辞をつけると、refs/heads/、refs/tags/、refs/remotes/などが表示されます。
これらはブランチ名の省略されていない表記を表しています。
接頭語の省略形
例えばgit branch
でブランチ一覧を表示したときに表示されるブランチ名や、ローカルのリモートレポジトリ名は省略形です。
$ git branch -a
* master
slaves
remotes/origin2/master
remotes/origin2/slaves
remotes/origin2/test
接頭語を省略しない場合
実際の各ブランチの内容は.gitディレクトリ配下のrefsディレクトリに格納されています。プロジェクトのルートディレクトリでfind .git/refs
を実行すると以下のように表示されます。
$ find .git/refs
.git/refs
.git/refs/heads
.git/refs/heads/master
.git/refs/heads/slaves
.git/refs/tags
.git/refs/tags/v1.0
.git/refs/remotes
.git/refs/remotes/origin2
.git/refs/remotes/origin2/test
.git/refs/remotes/origin2/master
.git/refs/remotes/origin2/slaves
これらのファイルパスも細かく記述したのが--decorate=full
オプションです。基本的にfullオプションを使うことはないと思います。