プログラミング
 Computer >> コンピューター >  >> プログラミング >> プログラミング

Gitログを使いこなそう:コミット履歴の表示とフィルタリング完全ガイド

バージョン管理システムの中核となる目的は、コードベースが時間とともにどのように変化してきたかを記録することです。これにより、プロジェクトがどのように進化してきたのかを振り返ったり、誰がプロジェクトに貢献したのか、いつどのような変更がコードに加えられたのかを把握したりできます。

では、Gitリポジトリが記録した履歴は、実際にはどうやって確認すればよいのでしょうか。そこで活躍するのが git log コマンドです。

この記事では、具体例を交えながら git log コマンドの基本と、Gitリポジトリの調査に役立てる方法を詳しく解説します。

git logコマンドとは

git log コマンドは、リポジトリに対して行われたすべてのコミットの一覧を表示します。各コミットのハッシュ値、コミットメッセージ、その他のメタデータを確認でき、リポジトリの履歴を表示する際に非常に便利です。

git status コマンドが現在の作業ディレクトリの状態に焦点を当てているのに対し、git log はリポジトリの歴史そのものを確認できるのが特徴です。

git logコマンドの実行例

ここからは、実際の例をもとに git log の動きを見ていきましょう。「demo-repository」というリポジトリで作業しており、プッシュ済みの全コミットの一覧を確認したい場面を想定します。その場合は、次のコマンドを実行します。

git log

このコマンドは、リポジトリ内の全コミットを一覧で返します。出力される1件のコミットは、以下のような形式です。

commit 43433c674e3d6c86a889fad222dae179785893cf (HEAD -> master, origin/master, origin/HEAD)
Author: James Gallagher <37276661+jamesgallagher432@users.noreply.github.com>
Date: Tue Apr 7 13:09:58 2020 +0100

    Update index.html

この出力内容を順番に見ていきます。git log が返す各エントリーには、次の情報が含まれています。

  • SHAハッシュ: 各コミットを一意に識別するSecure Hash Algorithm(SHA)のハッシュ値。上の例では「43433c674e3d6c86a889fad222dae179785893cf」です。
  • 作者名: コミットを作成した人物。上の例では James Gallagher で、メールアドレスも併せて表示されます。
  • 日付: コミットがプッシュされた日時。上の例では2020年4月7日(火)です。
  • コミットメッセージ: そのコミットに関連付けられたメッセージ。上の例では「Update index.html」です。

これらの情報から、リポジトリ内の各コミットについて有用な詳細を把握できます。

git logの出力をフィルタリングする

デフォルトのままでは、git log は上記の形式ですべてのコミットを一覧表示します。コミット数が多くなると、ログを読み解くのが次第に大変になるのは想像に難くありません。

そこで便利なのが、git log に用意された各種オプション(フラグ)です。目的に応じてログを絞り込むことで、必要な情報だけを素早く取り出せます。

直近のコミット数で絞り込む

特定の件数だけコミットを表示したい場合は、-n オプションを使用します。

git log -n 3

このコマンドは、最新の3件のコミットのみを一覧表示します。

作者やコミッターで絞り込む

変更を書いた人(author)や、実際にコミットした人(committer)を条件に、結果を絞り込むことも可能です。たとえば「John Smith」が関わったコミットだけを表示したい場合は、次のコマンドを使います。

git log --author="John Smith"
git log --committer="John Smith"

--author は変更内容を実際に書いた人物で結果を限定し、--committer はコミットを実際に行った人物で結果を限定します。

多くの場合、authorとcommitterは同じ人物ですが、大規模なプロジェクトではコードの作者と、それをリポジトリにプッシュする人が異なることもあります。こうしたケースに対応するため、2つのオプションが用意されています。

日付で絞り込む

日付を条件にフィルタリングすることもできます。使用するのは --before--after の2つのオプションです。どちらも幅広い日付形式を受け付けますが、特によく使われるのが相対的な指定(例:「yesterday」)と完全な日付指定(例:「2019-3-2」)です。

たとえば、2019年3月2日以降のコミットを取得したい場合は、次のようにします。

git log --after="2019-3-2"

逆に、昨日より前のコミットを取得したい場合は、相対的な値を指定します。

git log --before="yesterday"

さらに、期間を組み合わせることもできます。2019年3月2日以降かつ2019年3月19日以前のコミットを取得するには、次のコマンドを実行します。

git log --after="2019-3-2" --before="2019-3-19"

ファイルで絞り込む

git log を使う際、「特定のファイルに影響を与えたコミットだけ」を確認したいことがあります。その場合は、対象のファイルパスを指定しましょう。

たとえば「main.py」に対して行われた変更の履歴を確認したい場合は、次のコマンドを使用します。

git log -- main.py

-- は、続く引数がブランチ名ではなくファイルパスであることを git log に伝えるための区切りです。

上の例では1つのファイルだけを指定しましたが、複数のファイルを指定して絞り込むことも可能です。

コードの内容で絞り込む

特定の行のコードが追加・削除されたコミットを検索することもできます。

たとえば、コードに「# Introduction」という文字列を追加したコミットをすべて探したい場合は、次のコマンドを使います。

git log -S"# Introduction"

-S オプションは、探したい変更内容を指定するためのものです。ポイントとして、-S と検索語の間にはスペースやイコール記号を入れず、検索語は引用符で囲んで指定します。

コミット範囲で絞り込む

sinceuntil の考え方を使えば、特定の範囲のコミットだけを git log に渡すこともできます。

たとえば、コミットb72beb5以降からコミットb53b22dまでの間にプッシュされたコミットの一覧を取得したい場合は、次のコマンドを実行します。

git log b72beb5..b53b22d

このコマンドは、b72beb5とb53b22dの間にあるすべてのコミットを一覧で返します。

コミットメッセージで絞り込む

--grep オプションを使うと、コミットメッセージの内容を条件に結果を絞り込めます。

たとえば、メッセージが「feat:」で始まるコミットをすべて取得したい場合は、次のコードを使用します。

git log --grep="feat:"

このコマンドは、メッセージが「feat:」で始まるすべてのコミットを一覧表示します。

git logの出力を見やすく整形する

ここまでは、git log の標準的な出力(SHA、作者名、日付、コミットメッセージ)を扱ってきました。これらの情報は確かに有用ですが、特定のデータだけを手軽に取得したい場面も多いはずです。幸い、git log には出力形式を整えるためのオプションがいくつか用意されています。

1行表示で簡潔なログを得る

デフォルトでは、git log は各コミットの完全なログエントリーを返します。--oneline オプションを使えば、コミットIDと対応するメッセージだけを簡潔に一覧できます。

git log --oneline

先ほどのリポジトリでこのコマンドを実行すると、次のような出力が得られます。

43433c6 (HEAD -> master, origin/master, origin/HEAD) Update index.html
a7d8dc2 docs: Update README.md
b53b22d feat: Update website
3b16026 feat: Launch new homepage
b72beb5 first commit

各コミットのIDとメッセージの最初の1行だけが表示され、1コミットにつき1行に収まります。通常なら表示される大量のメタデータを省けるため、格段に読みやすくなります。この1行表示テクニックは、情報を詰め込みすぎずにコミット履歴を俯瞰したいときに非常に便利です。

参照情報(ブランチ・タグ)を表示する

--decorate オプションを使うと、特定のコミットを指しているすべての参照(ブランチやタグなど)を確認できます。

git log --oneline --decorate

このコマンドの出力は次のとおりです。

43433c6 (HEAD -> master, origin/master, origin/HEAD) Update index.html
a7d8dc2 docs: Update README.md
b53b22d feat: Update website
3b16026 (tag: v1) feat: Launch new homepage
b72beb5 first commit

リストの4番目のコミットにタグ名「v1」が表示されるようになりました。これは --decorate によって、コミット履歴の各コミットに関連付けられた参照情報が明示されるためです。

差分(diff)を表示する

--stat オプションを使うと、各コミットでリポジトリに追加・削除されたコードの行数を表示できます。

git log --stat

実行結果の例は次のとおりです。

Author: James Gallagher <james@users.noreply.github.com>
Date: Mon Apr 6 09:11:46 2020 +0100

    feat: Update website

 index.html | 1 +
 index.js   | 0
 2 files changed, 1 insertion(+)

プラス記号(+)は追加された行を、マイナス記号(-)があれば削除された行を表します。このデータにより、リポジトリ全体に対してどのような変更が加えられたのかを深く把握できます。

さらに具体的な変更内容を確認したい場合は、-p オプションを使用します。こちらは、コミットで行われた変更を詳細に示すdiff(差分)を返します。

git log -p

サンプルリポジトリで実行した際に返される1エントリーの例がこちらです。

Author: James Gallagher <37276661+jamesgallagher432@users.noreply.github.com>
Date: Tue Apr 7 13:09:58 2020 +0100

    Update index.html

diff --git a/index.html b/index.html
index f45673f..2d2701d 100644
--- a/index.html
+++ b/index.html
@@ -1,2 +1,3 @@
-This is a file.
-Changes have been made.
+<body>
+  <p>This is a website.</p>
+</body>

この出力では、コミットの概要と、そのコミットで行われた各変更の詳細な内訳の両方を確認できます。誰が、いつ、リポジトリ内のファイルへコンテンツを追加・削除したのかがひと目でわかります。

ただし、表示すべきコミットが多い場合、この出力はすぐに読みにくくなります。本記事で紹介した他のオプションと組み合わせれば、網羅性と可読性の両立を図れます。

Gitの差分表示についてさらに学びたい方は、git diff コマンドのガイドも参考にしてください。

git shortlogコマンドで要約を表示する

git shortlog コマンドは、git log の内容を要約して表示します。出力は作者ごとにグループ化されるため、誰がどのような変更を行ったのかを簡単に把握できます。

先ほどのリポジトリで git shortlog を実行してみましょう。

git shortlog

結果は次のようになります。

James Gallagher (5):
      first commit
      feat: Launch new homepage
      feat: Update website
      docs: Update README.md
      Update index.html

この例ではJamesが唯一のコントリビューターで、合計5件のコミットを行っています。もし他のコントリビューターがいれば、それぞれの名前と、リポジトリへプッシュしたコミットの総数がここに並んで表示されます。

まとめ

git log コマンドを使えば、リポジトリにどんな変更が、誰によって、いつ加えられたのかを確認できます。さらに、出力をフィルタリングすれば、知りたい情報だけを的確に抽出することも可能です。

git log のオプションは大きく2種類に分けられます。1つはログの出力形式を整えるもの(--oneline--decorate--stat-p など)、もう1つは返されるコミットを絞り込むもの(-n--author--grep など)です。

本記事では、具体例とともに git log の基本的な使い方と、よく使われる主要オプションを解説しました。git log はGitを扱ううえで欠かせない強力なツールです。このコマンドを使いこなせるようになれば、Gitリポジトリの調査は思いのままです!

Gitについてさらに学びたい方は、Git学習ガイドもぜひ参考にしてください。

  1. 優先度逆転問題を解決する「優先度継承プロトコル(PIP)」とは?仕組みと実用例を徹底解説

    優先度継承プロトコル(Priority Inheritance Protocol:PIP)は、リアルタイムオペレーティングシステム(RTOS)で使用される同期機構の一つで、優先度逆転(priority inversion)問題を解決するために設計されています。優先度逆転とは、高優先度タスクが、共有リソースを保持している低優先度タスクによってブロックされ、システム全体に遅延が発生し、最悪の場合デッドラインを逃すという深刻な問題です。優先度逆転問題とは優先度の異なる3つのタスク、高優先度(H)、中優先度(M)、低優先度(L)を考えてみましょう。タスクLがあるリソースを獲得した直後、そのリソースを必

  2. B木(Bツリー)とは?データ構造の特徴と基本操作をわかりやすく解説

    本記事では、B木(B-Tree)について詳しく解説します。B木は、m-way探索木を特殊化したデータ構造であり、ディスクアクセスを目的として広く利用されています。B木の基本構造次数(オーダー)が m のB木では、1つのノードが最大で m-1 個のキーと m 個の子を持つことができます。この特性により、1つのノードに大量の要素を格納できるため、木全体の高さが比較的低く抑えられる点が大きな利点です。高さが低いということは、検索時にアクセスするノード数が少なくて済むため、ディスクI/Oのコストが高い環境、たとえばデータベースやファイルシステムにおいて特に有効です。B木の満たすべき性質B木はm-way