更新: 2026年03月 · 7 分で読める · 3,624 文字
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 公式ドキュメントでさらに詳細なオプションを確認できますので、チーム運用に合わせてカスタマイズしてみてください。
おすすめGitリソース
- Pro Git Book Official free Git book. From basics to advanced topics.
- GitHub Docs Official GitHub documentation including PR/Issue workflows.
- Learn Git Branching Interactive tool to visually learn branch operations.