本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回はGitについて、コミットログを表示する「git log」コマンドです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は基礎編、応用編(その1)に続き、Gitについてコミットログを表示する「git log」コマンドです。コミットログの表示形式を変える方法を解説します。
「git」は「Git」という分散型バージョン管理システム用のコマンドです。Gitは元々Linuxカーネルのソースコードを管理するために作られた「バージョン管理システム」で、現在は多くのソフトウェアやWebサイトのソースコード、ドキュメントの管理などに用いられています。
ソースコードを管理する際、最新版だけを保存するやり方はうまくいきません。開発中のさまざまなタイミングで状態を管理し、必要に応じて比較、参照したり、元に戻したりできるようにする仕組みが「バージョン管理システム」です。
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 [オプション] [対象……]
※ 「対象」にはファイル名やブランチ、タグ、コミットのハッシュ値などが指定可能。[ ]は省略可能な引数を示しています。
短いオプション | 長いオプション | 意味 |
---|---|---|
-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ファイルのパスを表示する | |
コマンド | 実行内容 |
---|---|
clone | リポジトリのクローンを作成する |
init | リポジトリを新規作成する、または既存のリポジトリを初期化する |
remote | リモートリポジトリを関連付けする |
fetch | リモートリポジトリの内容を取得する |
pull | リモートリポジトリの内容を取得し、現在のブランチに取り込む(「fetch」と「merge」を行う) |
push | ローカルリポジトリの変更内容をリモートリポジトリに送信する |
add | ファイルをインデックスに追加する(コミットの対象にする) |
rm | ファイルをインデックスから削除する |
mv | ファイルやディレクトリの名前を変更する |
reset | ファイルをインデックスから削除し、特定のコミットの状態まで戻す |
status | ワークツリーにあるファイルの状態を表示する |
show | ファイルの内容やコミットの差分などを表示する |
diff | コミット同士やコミットと作業ツリーの内容を比較する |
commit | インデックスに追加した変更をリポジトリに記録する |
tag | コミットにタグを付ける、削除する、一覧表示する |
log | コミット時のログを表示する |
grep | リポジトリで管理されているファイルをパターン検索する |
branch | ブランチを作成、削除、一覧表示する |
checkout | 作業ツリーを異なるブランチに切り替える |
merge | 他のブランチやコミットの内容を現在のブランチに取り込む |
rebase | コミットを再適用する(ブランチの分岐点を変更したり、コミットの順番を入れ替えたりできる) |
config | 現在の設定を取得、変更する |
短いオプション | 長いオプション | 意味 |
---|---|---|
--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/」にあるファイル名を指定するため、シェルのパス名展開と同じ「*」記号などを使用できる。
短いオプション | 長いオプション | 意味 |
---|---|---|
-個数、-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件分を表示しています。
「git log」で出力する内容を細かく変更するには、「--pretty」オプションを使います。主な設定項目は次の通りです。
項目名 | 意味 |
---|---|
oneline | 「ハッシュ値」と「タイトル行」を1行で表示する |
short | 「ハッシュ値」「Author:」「タイトル行」を表示する(画面3を参照) |
medium | 「ハッシュ値」「Author:」「Date:」「タイトル行」「メッセージ全文」を表示する |
full | 「ハッシュ値」「Author:」「Commit:」「タイトル行」「メッセージ全文」を表示する |
fuller | 「ハッシュ値」「Author:」「AuthorDate:」「Commit:」「CommitDate:」「タイトル行」「メッセージ全文」を表示する(画面4を参照) |
また、「--pretty=format:書式」とすることで、指定した項目を選択して表示できます。「書式」を指定する際は、ハッシュ値や日付などを指定するプレースホルダーと、色や改行などを指定する制御文字を組み合わせます。さらに、日付の書式は「--date」オプションで指定できます。
記号 | 意味 |
---|---|
%H | コミットのハッシュ値を表す |
%h | コミットのハッシュ値(省略形)表す |
%P | 親コミット(変更元)のハッシュ値を表す |
%p | 親コミットのハッシュ値(省略形)を表す |
%an | 作者(Author)の名前を表す |
%ae | 作者のメールアドレスを表す |
%ad | コミットした日付(書式は「--date=」に従う)を表す |
%d | 参照名を表す(「--decorate」同様の書式でタグなどを表示する) |
%D | 参照名を表す(%dと同じだがカッコを除く) |
%s | タイトルを表す |
%f | タイトルを表す(「-」でつなぐなどの方法でファイル名として使いやすい状態にする) |
%b | メッセージ本文を表す |
%+ | 指定したプレースホルダー(例えば%b)が空ではない場合は直前に改行を入れる(画面6を参照) |
% | %の直後にスペースを置くと、プレースホルダーが空ではない場合、直前に空白を入れる(画面7を参照) |
%- | プレースホルダーが空だった場合、その前に入っている全ての空行を削除する(画面6を参照) |
%(桁数) | この後に続くプレースホルダーが指定した桁数に満たない場合は空白で埋める |
記号 | 意味 |
---|---|
%Cred | 文字の色を赤にする |
%Cgreen | 文字の色を黄緑にする |
%Cblue | 文字の色を水色にする |
%C(auto) | 文字の色を「git log --decorate」と同じにする(画面5と画面6を参照) |
%Creset | 元の色に戻す |
%n | 改行を入れる |
%x00 | 16進コードで表示する |
%% | 「%」という文字を指定する |
書式 | 意味 |
---|---|
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」コマンド)を用いた表示になります。
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.