git log –decorateとは何か?参照名(ref name)とは何かについて実例で解説(auto, short, fullの違い)

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

Gitの履歴を確認するコマンドにgit logコマンドがあります。

git logには「--decorate」オプションがあります。この「–decorate」が何をしているかについてまとめています。


–decorateは不要

結論から言うと、–decorateオプションをつける必要はありません

Gitのバージョン2.12.2以降は git logコマンドに、git log --decorate=autoがデフォルトでつく使用となりました。

このため、–decorateをつけてもつけなくても全く同じ結果が返ってきます

もし、–decorateの記述を見かけたら、過去の古い記事やコードを参照しているためだと思われます。

参考

git logをグラフ見やすくするときに、git log --graph --oneline --decorateを使っている場合がありますが、この場合も–decorateをつける必要はありません。

git log --graph --oneline でも全く同じ結果が返ります。

なお、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)を表示するオプションです(でした)。

Git - git-log Documentation


参照名(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オプションを使うことはないと思います。

タイトルとURLをコピーしました