【 git log 】コマンド(応用編その2)――コミットログを表示するLinux基本コマンドTips(388)

本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitについて、コミットログを表示する「git log」コマンドです。

» 2020年04月16日 05時00分 公開
[西村めぐみ@IT]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「Linux基本コマンドTips」のインデックス

Linux基本コマンドTips一覧

 本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は基礎編応用編(その1)に続き、Gitについてコミットログを表示する「git log」コマンドです。コミットログの表示形式を変える方法を解説します。

git/git logコマンドとは?

 「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアやWebサイトのソースコード、ドキュメントの管理などに用いられています。

 ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。

 Gitでは、テスト版など複数に枝分かれした状態も管理できます。複数のメンバーによる開発を前提としており、開発中の各時点におけるコメントや、コメントへの返信なども管理できるようになっています。

gitのサブコマンドとGitの仕組み

 gitコマンドはほとんどの場合、「サブコマンド」と組み合わせて利用します。今回紹介する「git log」はコミット時のログ(コミットログ)を表示するコマンドです(本連載ではgitとサブコマンドの組み合わせをコマンドとして紹介します)。

 gitコマンドが扱う「リポジトリ(repository)」とは、ソースコードや変更履歴、コメントなどを一括して保管する場所です。リポジトリには、自分のPC上に作る「ローカルリポジトリ」と、「GitHub」などのWebサービス上に作る「リモートリポジトリ」があり、両者を連携させることで複数の開発者による開発を1本にまとめることができます。

 既存のリポジトリ(リモートリポジトリ)にあるソースコードなどを入手したい場合は、まず、「git clone」(連載第381回)でリポジトリを自分の環境に複製します(※1)。リモートリポジトリの内容がバージョンアップされたら「git pull」(連載第382回)コマンドで最新版を取得します。開発に参加するのではなく、単に最新版を取得したいという場合は、「git clone」と「git pull」を利用すればよいでしょう。

※1 特定のファイルだけが欲しい場合、例えばGitHub(github.com)にあるリポジトリであれば「Raw」というボタンで表示されるURLを使い、「wget」コマンドなどを使ってダウンロードできる。この他、プロジェクト全体をダウンロードするためのリンクも用意されている([Clone or download]ボタン→「Download ZIP」)。



 保管場所であるリポジトリに対し、ファイルの編集などを行う場所を「ワークツリー」あるいは「ワーキングエリア」などと呼びます。「git clone」や「git pull」で取得した最新版のファイルはワークツリーに配置されます。つまり「作業ディレクトリ」です。

 ワークツリー(作業ディレクトリ)で編集した結果をリポジトリに反映する操作を「コミット」と呼びます。「git add」(連載第384回)コマンドでコミットしたいファイルを「インデックス」あるいは「ステージングエリア」と呼ばれる領域に追加します。インデックスにはファイルの変更箇所などが記録されます。

 インデックスの内容は「git commit」コマンドでローカルリポジトリにコミットされ、「git push」コマンドでローカルリポジトリの内容をリモートリポジトリに反映します。従って、「git add」や「git commit」などを行わなければ、自分の環境で編集した内容がリポジトリに影響を与えることはありません。自由に編集し、テストできます。なお、ワークツリーのファイルを過去の任意のコミット状態に戻すことも可能です。

 Gitには、この他、開発中のソースコードやドキュメントを、「テスト版」「○○版」……のように枝分かれさせたり、それらを合流させたりする機能もあります。枝分かれしたそれぞれのバージョンを「ブランチ」(branch)と呼び、ブランチを合流させることを「マージ」(merge)と呼びます。



コマンドの書式

git [オプション] サブコマンド [サブコマンドごとのオプションや引数]

git log [オプション] [対象……]

※ 「対象」にはファイル名やブランチ、タグ、コミットのハッシュ値などが指定可能。[ ]は省略可能な引数を示しています。




gitの主なオプション

短いオプション 長いオプション 意味
-C パス カレントディレクトリではなく指定したディレクトリで実行したものとする
--bare リポジトリを「bareリポジトリ」(ワーキングディレクトリが存在しない、管理だけを目的としたリポジトリ)として扱う
-c 設定=値 設定値を指定する(設定は「git config」で確認可能)
-p --paginate 全ての出力を「less」コマンドまたは環境変数PAGERで指定されたコマンドで表示する
-P --no-pager 「less」コマンドで表示しない(「-p」の指定を打ち消す)
--exec-path=パス gitの実行ファイルのパスを指定する(「--exec-path」のみの場合、実行ファイルのパスを表示する)
--html-path gitのHTML形式のドキュメントがインストールされたパスを表示する
--man-path gitのmanファイルのパスを表示する
--info-path gitのinfoファイルのパスを表示する

gitのサブコマンド

コマンド 実行内容
clone リポジトリのクローンを作成する
init リポジトリを新規作成する、または既存のリポジトリを初期化する
remote リモートリポジトリを関連付けする
fetch リモートリポジトリの内容を取得する
pull リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う)
push ローカルリポジトリの変更内容をリモートリポジトリに送信する
add ファイルをインデックスに追加する(コミットの対象にする)
rm ファイルをインデックスから削除する
mv ファイルやディレクトリの名前を変更する
reset ファイルをインデックスから削除し、特定のコミットの状態まで戻す
status ワークツリーにあるファイルの状態を表示する
show ファイルの内容やコミットの差分などを表示する
diff コミット同士やコミットと作業ツリーの内容を比較する
commit インデックスに追加した変更をリポジトリに記録する
tag コミットにタグを付ける、削除する、一覧表示する
log コミット時のログを表示する
grep リポジトリで管理されているファイルをパターン検索する
branch ブランチを作成、削除、一覧表示する
checkout 作業ツリーを異なるブランチに切り替える
merge 他のブランチやコミットの内容を現在のブランチに取り込む
rebase コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる)
config 現在の設定を取得、変更する

git logの主なオプション(フォーマット関連)

短いオプション 長いオプション 意味
--graph ログとともに、枝分かれやマージの様子を示すグラフを表示する
--reverse ログを逆順(古い順)に表示する(--graphとは同時に指定できない)
--decorate=表示 refs部分の表示方法を「short」「full」「auto」「no」のいずれかで指定する(※2)。「full」は接頭辞(refs/heads/、refs/tags/、refs/remotes/)付きで表示、「short」は接頭辞を付けずに表示(デフォルト)、「auto」は画面表示の際は表示、それ以外のときは非表示、「no」常に非表示になる
--no-decorate 「--decorate=no」相当の指定となる
--stat ログとともに、どのファイルが何カ所変更されたのかを表示する
--name-only ログとともに、変更されたファイルの名前のみを表示する
--shortstat ログとともに、追加、修正、削除の個数のみを表示する
--name-status ログとともに、変更されたファイルの変更情報(追加、修正、削除のいずれか)を表示する
-p、-u --patch 差分の内容を表示する
--abbrev-commit コミットのハッシュ値を、特定できる範囲の省略形(デフォルトは先頭7バイト分)で表示する
--no-abbrev コミットのハッシュ値を全て表示する(40バイト)
--abbrev=バイト数 コミットのハッシュ値を指定したバイト数分だけ表示する
--parents 親コミット(変更元)のハッシュ値も一緒に表示する
--pretty 表示フォーマットを「oneline」「short」「medium」(デフォルト)、「full」「fuller」で指定する。「--pretty=format:」で書式を指定可能
--date 日付の書式
--oneline 各コミットを1行で簡潔に表示する(「--pretty=oneline --abbrev-commit」相当)

※2 .git/refsは「参照先」を管理するディレクトリ。例えば、「.git/refs/heads/master」ファイルには、最新のコミットのハッシュ値が保存されている。「--branches」「--tags」「--remotes」はそれぞれ「.git/refs/branches/」「.git/refs/brances/tags/」「.git/refs/brances/remotes/」にあるファイル名を指定するため、シェルのパス名展開と同じ「*」記号などを使用できる。



git logの主なオプション(表示対象関連)

短いオプション 長いオプション 意味
-個数、-n 個数 --max-count=個数 表示するコミットの個数を指定する
--skip=個数 先頭からスキップするコミットの個数を指定する
--since=日付、--after=日付 指定した日付以降のコミットを表示する。「--since=2020/4/1」のような指定の他、「--since="2 days ago"」のような指定も可能
--until=日付、--before=日付 指定した日付までのコミットを表示する
-L 対象 「-l :関数名:ファイル名」または「-L 開始位置,終了位置:ファイル名」で、指定した関数の変更履歴を表示する。関数名や位置の指定には正規表現を使用可能
--merges マージしたときのコミットを表示する
--no-merges マージしたときのコミットを除いて表示する
--first-parent 最初に親となったコミットを表示する(マージコミットのマージ元を除外する)
--all 全てのブランチを表示する
--branches 「refs/heads」の全てのブランチを指定する。「--branches=パターン」で対象を指定できる(※2)
--tags 「refs/tags」の全てのタグを指定する。「--tags=パターン」で対象を指定できる(※2)
--remotes 「refs/remotes」の全てのリモートブランチを指定する。「--remotes=パターン」で対象を指定できる(※2)
--grep=文字列 コミットメッセージに指定した文字列を含んでいるコミットを表示する。正規表現によるパターン指定が可能
-i --regexp-ignore-case 正規表現の指定で大小文字を区別しない
--basic-regexp 正規表現の指定で基本正規表現を使用する(デフォルト)
-E --extended-regexp 正規表現の指定で拡張正規表現を使用する
--invert-grep 正規表現の指定で当てはまらなかったものを表示する
-F --fixed-strings 正規表現の指定を固定文字列として扱う(正規表現として解釈しない)
-P --perl-regexp 正規表現の指定でPerl互換の動作とする
--author=文字列 コミットのAuthor欄(名前とメールアドレス)に、指定した文字列を含んでいるコミットを表示する。正規表現によるパターン指定が可能


ブランチの分岐とマージを表示する

 ブランチの分岐やマージの様子をコミットログから確認したい場合は、「--graph」オプションを使用します。コミットの先頭に「*」や「/」などの記号を付けて、ブランチの分岐の様子をグラフで示します。

 ログが長いと分岐の様子が分かりにくくなるので、1回のコミットを1行で表示する「--oneline」オプションを一緒に使用するとよいでしょう。また、表示を1行まで減らさなくても、「--pretty=short」オプションを指定することで、ログを短く表示できます(以下の本文を参照、※3)。

※3 この他、「git log --graph --oneline | more」のように端末以外へ出力すると、refs(タグなど)の表示がなくなってしまいます。これを避けるには「--decorate」オプションを使い、常にカラー表示にするには「--color=always」オプションを併用します。



コマンド実行例

git log --graph --oneline

(コミットをグラフ表示する)

git log --graph --pretty=short

(コミットをグラフ表示する)


 画面1は「--oneline」を指定して最新のコミット10件分を表示し、画面2は「--pretty=short」を指定して4件分を表示しています。

画面1 画面1 ブランチの分岐とマージをグラフ表示したところ
画面2 画面2 画面1よりもログの情報量を増やして表示したところ


書式を細かく指定して表示する

 「git log」で出力する内容を細かく変更するには、「--pretty」オプションを使います。主な設定項目は次の通りです。

「--pretty=」で指定できる主な設定

項目名 意味
oneline 「ハッシュ値」と「タイトル行」を1行で表示する
short 「ハッシュ値」「Author:」「タイトル行」を表示する(画面3を参照)
medium 「ハッシュ値」「Author:」「Date:」「タイトル行」「メッセージ全文」を表示する
full 「ハッシュ値」「Author:」「Commit:」「タイトル行」「メッセージ全文」を表示する
fuller 「ハッシュ値」「Author:」「AuthorDate:」「Commit:」「CommitDate:」「タイトル行」「メッセージ全文」を表示する(画面4を参照)

 また、「--pretty=format:書式」とすることで、指定した項目を選択して表示できます。「書式」を指定する際は、ハッシュ値や日付などを指定するプレースホルダーと、色や改行などを指定する制御文字を組み合わせます。さらに、日付の書式は「--date」オプションで指定できます。

「--pretty=format:」で指定できる主な書式記号(プレースホルダー)

記号 意味
%H コミットのハッシュ値を表す
%h コミットのハッシュ値(省略形)表す
%P 親コミット(変更元)のハッシュ値を表す
%p 親コミットのハッシュ値(省略形)を表す
%an 作者(Author)の名前を表す
%ae 作者のメールアドレスを表す
%ad コミットした日付(書式は「--date=」に従う)を表す
%d 参照名を表す(「--decorate」同様の書式でタグなどを表示する)
%D 参照名を表す(%dと同じだがカッコを除く)
%s タイトルを表す
%f タイトルを表す(「-」でつなぐなどの方法でファイル名として使いやすい状態にする)
%b メッセージ本文を表す
%+ 指定したプレースホルダー(例えば%b)が空ではない場合は直前に改行を入れる(画面6を参照)
% %の直後にスペースを置くと、プレースホルダーが空ではない場合、直前に空白を入れる(画面7を参照)
%- プレースホルダーが空だった場合、その前に入っている全ての空行を削除する(画面6を参照)
%(桁数) この後に続くプレースホルダーが指定した桁数に満たない場合は空白で埋める

「--pretty=format:」で指定できる主な書式記号(制御文字)

記号 意味
%Cred 文字の色を赤にする
%Cgreen 文字の色を黄緑にする
%Cblue 文字の色を水色にする
%C(auto) 文字の色を「git log --decorate」と同じにする(画面5と画面6を参照)
%Creset 元の色に戻す
%n 改行を入れる
%x00 16進コードで表示する
%% 「%」という文字を指定する

「--date=」で指定できる主な書式(※4)

書式 意味
relative 相対的な値で表示する(「2 hours ago」「3 years ago」など)
short 日付のみ(「YYYY-MM-DD」)を表示する(画面5を参照)
iso、iso8601 ISO 8601と似た書式で表示する(「2020-02-29 11:49:32 +0900」など)
rfc、rfc2822 RFC 2822フォーマットで表示する(メールで使われている書式「Sat, 29 Feb 2020 11:49:32 +0900」など。画面6を参照)
default RFC 2822同様だが、ローカルのタイムゾーンと同じ場合はタイムゾーンの表示を省略する。さらに、曜日の後の「,」を表示しない

※4 タイムゾーンはログの内容に従うが、「--date=rfc-local」のように「-local」を付けるとシステムのタイムゾーンでの表示となる(--date=relativeを除く)。「--date=local」で「--date=default-local」相当となる。



コマンド実行例

git log --pretty=short

(ログを短いフォーマットで表示する)(画面3

git log --pretty=fuller

(ログを長いフォーマットで表示する)(画面4

git log --date=short-local --pretty=format:"[%ad] %C(auto)%h%d%Creset %s"

(出力内容を指定して表示する)(画面5

git log --date=rfc --pretty=format:"%C(auto)%ad%n%H%n%d%Creset %s%+b%-n"

(出力内容を指定して表示する)(画面6

git log --date=short --pretty=format:"%C(auto)%h% D% d%Creset" --graph -10

(出力内容を指定してグラフ表示する(画面7


 画面3から画面7まではそれぞれ、実行結果とコマンドラインを見やすいように、「-件数」(-n 件数)オプションで件数を調整して表示しています。1画面で表示しきれない場合は、いずれの場合も、ページャ(「less」コマンド)を用いた表示になります。

画面3 画面3 書式を指定して2件分のコミットログを表示したところ 「ハッシュ値」「Author:」「タイトル行」を表示するよう指定した
画面4 画面4 書式を指定して2件分のコミットログを表示したところ 「ハッシュ値」「Author:」「AuthorDate:」「Commit:」「CommitDate:」「タイトル行」「メッセージ全文」を表示するよう指定した
画面5 画面5 書式を指定して10件分のコミットログを表示したところ 各行の表示内容は先頭から、コミットした日付、コミットの値(省略形)、参照名、タイトル。文字色と日付のフォーマットも変えている
画面6 画面6 書式を指定して4件分のコミットログを表示したところ コミットした日付、コミットのハッシュ値、参照名、タイトルについて改行を入れながら表示した。文字色と日付のフォーマットも変えている
画面7 画面7 書式を指定して10件分のコミットログをグラフ表示したところ コミットのハッシュ値(省略形)と2種類の異なる書式で参照名を表示した。文字色と日付のフォーマットも変えている。なお「% 」を2回使っている


筆者紹介

西村 めぐみ(にしむら めぐみ)

元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。