git log で効率よく履歴を検索する実践的なコマンド集

開発プロジェクトで過去のコミット履歴を素早く検索できることは、バグの原因特定やコード変更の追跡に欠かせません。本記事では、git log の強力な検索・フィルタリング機能を実務レベルで活用するコマンドを具体例を交えて紹介します。実装してすぐに日々の開発効率が向上します。

git log の基本的な検索構文

git log は単に履歴を表示するだけでなく、強力な検索機能を備えています。まずは基本となる検索パターンを理解しましょう。

特定のキーワードを含むコミットを検索する

コミットメッセージに特定の単語が含まれるコミットを探す場合、--grep オプションを使います。これは実務でバグ修正関連のコミットを一括検索する際に非常に便利です。

git log --grep="fix" --oneline

上記コマンドは、メッセージに「fix」を含むすべてのコミットを1行形式で表示します。大文字小文字を区別せずに検索したい場合は -i フラグを追加してください。

git log --grep="API" -i --oneline

複数の条件で絞り込む

複数の検索条件を組み合わせる場合、--all-match オプションで AND 検索が可能です。また、--or を使えば OR 検索もできます。

# 「refactor」と「database」の両方を含むコミットを検索
git log --grep="refactor" --grep="database" --all-match --oneline

# 「feature」または「enhancement」のいずれかを含むコミット
git log --grep="feature" --grep="enhancement" --oneline

変更内容でコミットを検索する

特定のファイルを変更したコミットを抽出

「このファイルは誰が、いつ最後に変更したのか?」といった場面は実務で頻繁に発生します。--follow-- filename を組み合わせることで、特定ファイルの変更履歴を追跡できます。

# config.json の変更履歴を表示
git log --oneline -- config.json

# ファイルのリネーム前の履歴も追跡
git log --follow --oneline -- config.json

さらに詳細な変更内容を確認したい場合は、-p フラグで diff を表示することをお勧めします。

git log -p --follow -- config.json

特定のコード行を変更したコミットを追跡

「このコード行はいつ、どのコミットで追加されたのか」を調べる場合、git log -S を使用します。これは「pickaxe」と呼ばれ、実装の根拠を遡る際に役立ちます。

# 「dataValidation」という関数を追加・削除したコミットを検索
git log -S "dataValidation" --oneline

# 差分も表示して、実際の変更を確認
git log -S "dataValidation" -p

日時範囲でフィルタリングする

特定期間のコミットを検索

スプリント単位やリリース周期でのコミット検索は、--since--until オプションで実現できます。

# 過去1週間のコミット
git log --since="1 week ago" --oneline

# 過去30日間のコミット
git log --since="30 days ago" --oneline

# 特定期間(2024年1月1日から2月29日)
git log --since="2024-01-01" --until="2024-02-29" --oneline

特定の時刻以降のコミットのみ表示

# 2024年3月15日の14:30以降のコミット
git log --since="2024-03-15 14:30:00" --oneline

作成者とブランチ別の検索

特定の作成者のコミットを抽出

チームメンバーの作業内容を追跡する場合、--author オプションが便利です。

# Tanaka というユーザー名のコミット
git log --author="Tanaka" --oneline

# 大文字小文字を区別しない検索
git log --author="tanaka" -i --oneline

特定のブランチの履歴を検索

マージベースからの変更を追跡する場合は、ブランチ名を指定して検索できます。

# feature/user-auth ブランチの履歴
git log feature/user-auth --oneline

# main ブランチに存在しない feature ブランチ固有のコミット
git log main..feature/user-auth --oneline

実務ですぐに使える複合検索の例

バグ修正の履歴を完全に追跡する

以下は、特定の関数に関連するバグ修正を、過去3ヶ月間で検索する実例です。

git log --since="3 months ago" \
  --grep="bug" -i \
  -S "calculateDiscount" \
  --author="development-team" \
  --oneline

特定ファイルの最近の変更を追跡

# src/api.js の過去2週間の変更と作成者を表示
git log --since="2 weeks ago" \
  --format="%h %an %ad %s" \
  --date=short \
  -- src/api.js

よくあるハマりポイント:正規表現のエスケープ

--grep で正規表現を使用する場合、シェルのメタ文字をエスケープする必要があります。検索が上手くいかない場合は、シングルクォートで囲むか、バックスラッシュでエスケープしてください。

# 正: 正規表現をシングルクォートで囲む
git log --grep='^fix.*bug$' --oneline

# 正しくない例:ダブルクォートだと $ が解釈される
git log --grep="^fix.*bug$" --oneline

検索結果をカスタマイズする

出力形式をカスタマイズ

--format オプションで、表示情報をカスタマイズできます。チームでの共有レポートを作成する際に活用します。

# コミットハッシュ、作成者、日付、メッセージを表示
git log --format="%h %an %ad %s" --date=short --oneline

# より詳細な情報:タイムスタンプ付き
git log --format="%h | %an | %ai | %s" --oneline

検索結果を統計情報で表示

--stat オプションで、各コミットで変更されたファイル数と行数を表示できます。コード量の把握に便利です。

git log --since="1 week ago" --stat --oneline

git log の代替ツールとの比較

Git GUI ツール(SourceTree、GitKraken など)は視覚的に分かりやすい利点がありますが、スクリプト化や自動化が必要な場合は、git log コマンドラインの方が効率的です。CI/CD パイプラインでのコミット分析には特にコマンドラインが向いています。

よくある質問

まず git log --all で全ブランチの履歴を対象に検索してください。デフォルトではカレントブランチのみが対象です。また、大文字小文字の違いが原因の場合は -i フラグで大文字小文字を区別しない検索を試してください。

--format で出力形式を制御し、Unix コマンドのパイプと組み合わせることで対応できます。ただし、JSON での構造化出力には git log --format=format:'%H|%an|%ai|%s' でパイプ区切りにしてから、別のツールで JSON に変換するのが実用的です。

git reflog を使うと、削除されたコミットも含めた全ての参照変更を確認できます。ただし、データベースのガベージコレクション後は復旧不可能なため、重要なコミットは早期に対処してください。

まとめ

  • --grep でコミットメッセージから検索し、-i で大文字小文字を区別しない検索が可能
  • -- filename で特定ファイルの変更履歴を、-S で特定コード行を追跡できる
  • --since--until で日時範囲指定、--author で作成者別検索が実現できる
  • 複数条件を組み合わせることで、強力な絞り込み検索が実現でき、実務での問題解決が加速する
  • --format でカスタマイズ出力が可能で、レポート作成や自動化に活用できる

これらのコマンドをシェルスクリプトで組み合わせれば、自動的にコミット分析レポートを生成することも可能です。Git 公式ドキュメントでさらに詳細なオプションを確認できますので、チーム運用に合わせてカスタマイズしてみてください。

K
AWS・Python・生成AIを専門とするソフトウェアエンジニア。AI・クラウド・開発ワークフローの実践ガイドを執筆しています。詳しく見る →