第2章 Git運用ガイド

git logでコミット履歴を表示

git logの基本的な使い方

git logコマンドは過去のコミット履歴を表示します

git log

git logの出力結果は次のようになります。

commit e8354b0edab2132c7db93b0e87763659722ac080 (HEAD -> master)
Merge: eb53b72 b8a0c7b
Author: Jun Tamagawa <jun@rfs.jp>
Date:   Tue Jul 13 15:39:38 2021 +0900

    Merge branch 'newbranch'

commit b8a0c7b9cd8efe0cd7361547c26e865297b85cdb (newbranch)
Author: Jun Tamagawa <jun@rfs.jp>
Date:   Tue Jul 13 15:38:59 2021 +0900

    new.txtファイルの追加

commit eb53b72150c78168bb5c2e8468eedad232d1ea8b
Author: Jun Tamagawa <jun@rfs.jp>
Date:   Tue Jul 13 15:37:28 2021 +0900

    readmeのテキスト変更

commit 81a1c0c1442f4927877809ea9822547a5039bc21
Author: Jun Tamagawa <jun@rfs.jp>
Date:   Tue Jul 13 15:36:51 2021 +0900

    初期登録

オプションなどで指定していないと、git logはコミットを新しい順に表示します。表示される内容は上から順に下記の項目です。

  • SHA-1チェックサム(ハッシュ)
  • 編集者名とメールアドレス
  • コミット日時
  • コミットメッセージ

git logのオプション

git logには数多くのオプションが用意されています。代表的なオプションが-pで、これは各コミットの変更点を表示します。そのあとにハイフンのあとに続けて数値を指定すると、指定された分のエントリだけを出力します。

次の例では-pに-3を続けて、3つのエントリの履歴と変更点を表示しています。

git log -p -3
commit e8354b0edab2132c7db93b0e87763659722ac080 (HEAD -> master)
Merge: eb53b72 b8a0c7b
Author: Jun Tamagawa <jun@rfs.jp>
Date:   Tue Jul 13 15:39:38 2021 +0900

    Merge branch 'newbranch'

commit b8a0c7b9cd8efe0cd7361547c26e865297b85cdb (newbranch)
Author: Jun Tamagawa <jun@rfs.jp>
Date:   Tue Jul 13 15:38:59 2021 +0900

    new.txtファイルの追加

diff --git a/new.txt b/new.txt
new file mode 100644
index 0000000..befa0e3
--- /dev/null
+++ b/new.txt
@@ -0,0 +1 @@
+newbranchで追加

commit eb53b72150c78168bb5c2e8468eedad232d1ea8b
Author: Jun Tamagawa <jun@rfs.jp>
Date:   Tue Jul 13 15:37:28 2021 +0900

    readmeのテキスト変更

diff --git a/readme.txt b/readme.txt
index b8f3380..3c1909e 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1 +1,2 @@
 初期登録
+更新

オプション

オプション説明
-p各コミットのdiffを表示
--stat各コミットで変更されたファイルの統計情報を表示
--shortstat--stat コマンドのうち、変更/追加/削除の行だけを表示
--name-only変更されたファイルの一覧を表示
--name-status変更されたファイルと追加/修正/削除情報を表示
--abbrev-commitハッシュの全体ではなく最初の数文字のみを表示
--relative-date相対フォーマット ("2 weeks ago"など) で日付を表示
--graphブランチやマージの履歴を、ログ出力とともにアスキーグラフで表示
--prettyコミットを別のフォーマットで表示する。オプションとして oneline、 short、full、fuller、formatを指定可能
--onelineコミットを1行で表示
--word-diff単語単位でdiffを表示

--oneline コミットを一行で表示

--onelineオプションは各コミットを一行で表示させます。表示情報はハッシュの短縮とコミットコメントとなります。

git log --oneline
e8354b0 (HEAD -> master) Merge branch 'newbranch'
b8a0c7b (newbranch) new.txtファイルの追加
eb53b72 readmeのテキスト変更
81a1c0c 初期登録

--graph コミットをツリー形式で表示

--graphオプションはコミットをツリー形式で表示します。このオプションによってブランチの分岐やマージ状況がわかりやすくなります。

git log --graph
*   commit e8354b0edab2132c7db93b0e87763659722ac080 (HEAD -> master)
|\  Merge: eb53b72 b8a0c7b
| | Author: Jun Tamagawa <jun@rfs.jp>
| | Date:   Tue Jul 13 15:39:38 2021 +0900
| |
| |     Merge branch 'newbranch'
| |
| * commit b8a0c7b9cd8efe0cd7361547c26e865297b85cdb (newbranch)
|/  Author: Jun Tamagawa <jun@rfs.jp>
|   Date:   Tue Jul 13 15:38:59 2021 +0900
|
|       new.txtファイルの追加
|
* commit eb53b72150c78168bb5c2e8468eedad232d1ea8b
| Author: Jun Tamagawa <jun@rfs.jp>
| Date:   Tue Jul 13 15:37:28 2021 +0900
|
|     readmeのテキスト変更
|
* commit 81a1c0c1442f4927877809ea9822547a5039bc21
  Author: Jun Tamagawa <jun@rfs.jp>
  Date:   Tue Jul 13 15:36:51 2021 +0900

      初期登録

--pretty フォーマットを指定して表示

--prettyオプションはデフォルトとは別に用意されたプリセットの書式を指定して、ログを表示させることができます。たとえばonelineオプションは、各コミットを一行で出力します。そのほか、情報量を増やすfullやfuller、少なめにするshortなどが用意されています。

git log --pretty=oneline
e8354b0edab2132c7db93b0e87763659722ac080 (HEAD -> master) Merge branch 'newbranch'
b8a0c7b9cd8efe0cd7361547c26e865297b85cdb (newbranch) new.txtファイルの追加
eb53b72150c78168bb5c2e8468eedad232d1ea8b readmeのテキスト変更
81a1c0c1442f4927877809ea9822547a5039bc21 初期登録

--prettyオプションの中でも、特にformat書式オプションが有用です。このformat書式オプションを使うと、数多く用意されたプレースホルダ(入力される値の代わりに仮に使用されるラベル)を使って独自の書式に整形することができます

たとえばコミットの短縮版ハッシュを意味する%hや、作業ユーザの名前を意味する%anを使って次のような書式で出力できます。

git log --pretty=format:"%h - %an, %ar : %s"
e8354b0 - Jun Tamagawa, 5 hours ago : Merge branch 'newbranch'
b8a0c7b - Jun Tamagawa, 5 hours ago : new.txtファイルの追加
eb53b72 - Jun Tamagawa, 5 hours ago : readmeのテキスト変更
81a1c0c - Jun Tamagawa, 5 hours ago : 初期登録

formatに指定できるプレースホルダ

比較的頻繁に使われるプレースホルダを下記に抜粋しました。全オプションはGitの公式リファレンス(https://git-scm.com/docs/pretty-formats)を参照してください。

オプション出力される内容
%Hコミットのハッシュ(短縮版は小文字)
%Tツリーのハッシュ(短縮版は小文字)
%P親のハッシュ(短縮版は小文字)
%an作業ユーザ(Author)の名前
%ae作業ユーザのメールアドレス
%ad作業した日付 (--date= オプションに従った形式)
%ar作業した相対日付
%cnコミットしたユーザ(Committer)の名前
%ceコミットしたユーザのメールアドレス
%cdコミットしたユーザの日付
%crコミットしたユーザの相対日付
%sコミットメッセージ
%dブランチやタグの名前
%C( )色、属性の指定

%C() プレースホルダは、括弧の中にしていした色や文字スタイルで修飾することができます

git log --pretty=format:"%h %C(bold)%cd"
e8354b0 Tue Jul 13 15:39:38 2021 +0900
b8a0c7b Tue Jul 13 15:38:59 2021 +0900
eb53b72 Tue Jul 13 15:37:28 2021 +0900
81a1c0c Tue Jul 13 15:36:51 2021 +0900

色はred、blue、green、yellow、cyan、magentaなどのプリセットの色名や、#ff0000のような8bitカラーが指定可能です。その他に、フォントスタイルのboldやul、このプレースホルダの効果をリセットするresetなどが指定可能です。また、%C()の中に複数のプレースホルダを空白で区切って指定することもできます。

次のコマンドは%C(reset)で前の色や文字スタイルをリセットし、%C(magenta ul)でmagentaとulの2種のプレースホルダを指定しています。

git log --pretty=format:'%C(yellow)%h %C(reset)%ar by %C(magenta ul)%an'

エイリアス

よく使う書式があれば、毎回入力しなくても良いようにGitのエイリアスに登録しておきましょう。設定ファイルに追記する場合は以下のような書式になります。

[alias]
 lg = log --graph --oneline --date=short --pretty=format:'%C(yellow)%h %C(reset)- %C(green)[%ad] %C(cyan)<%an>%C(reset) %C(red)%d%C(reset) %s' --abbrev-commit

設定ファイルは、環境全体であれば/etc/gitconfig、ユーザ単位であれば~/.gitconfig、リポジトリ単位であればワーキングディレクトリの.git/configになります。

この設定でlgというエイリアスが作成されているので、下記コマンドで登録した長いコマンドが呼び出されます。

git lg

フィルタリング

コミット履歴は期間や作業者名、ファイル名やディレクトリ名などでフィルタリングすることができます。

直近の2つのコミットを表示
git log -2
2週間の間のコミットを表示
git log --since=2.weeks
指定した日付以降
git log --after '2021-07-10'
指定した日時以前
git log --before '2021-07-10 09:00:00'
指定した期間
git log --after '2021-07-13' --before '2021-07-15'
作業者名で検索
git log --author 'Jun'

下記の表はよく使うフィルタリングオプションの抜粋です。

フィルタリングオプション

オプション説明
-(n)直近n件のコミットを表示
--after指定した日付より後のコミットを表示
--before指定した日付より前のコミットを表示
--author作業者名から指定した文字列にマッチするコミットを表示
--grepコミットメッセージから指定した文字列にマッチするコミットを表示
-S指定した文字列をコードに追加・削除したコミットを表示

関連記事