履歴

git grep

Gitが管理するファイル内のテキストをパターン検索します。ブランチやコミットを指定して検索することも可能です。

構文 git grep [options] <pattern> [<tree-ish>...] [[--] <pathspec>...]

オプション

フラグ 説明
-n, --line-number マッチした行の行番号を表示します。
-i, --ignore-case 大文字と小文字を区別せずに検索します。
-l, --files-with-matches マッチしたファイル名のみを表示します(内容は表示しない)。
-c, --count ファイルごとのマッチ数を表示します。
-e <pattern> 検索パターンを指定します。複数指定すると OR 検索になります。
--and, --or, --not 論理演算子で複数パターンを組み合わせて絞り込みます。
-p, --show-function マッチ箇所が属する関数名を表示します。コードレビューやデバッグに便利です。

git grep は、Git が管理するファイルの中からテキストパターンを検索するコマンドです。通常の grep と異なり、.gitignore で無視されたファイルやバイナリファイルをスキップするため、高速で精度の高い検索が可能です。

基本的な使い方

# 現在の作業ツリー全体から "TODO" を検索
git grep "TODO"

# 大文字・小文字を区別せず検索
git grep -i "todo"

# マッチした行番号も表示
git grep -n "TODO"

特定のブランチ・タグ・コミットを検索

# main ブランチの内容を検索
git grep "pattern" main

# 特定のタグ時点の内容を検索
git grep "pattern" v1.0.0

# 特定のコミット時点の内容を検索
git grep "pattern" a1b2c3d

複数パターンの検索

# "foo" または "bar" を含む行を検索(OR 検索)
git grep -e "foo" -e "bar"

# "foo" かつ "bar" を含む行を検索(AND 検索)
git grep -e "foo" --and -e "bar"

# "error" を含み、かつ "debug" を含まない行を検索
git grep -e "error" --and --not -e "debug"

出力を絞る

# マッチしたファイル名だけを表示
git grep -l "TODO"

# ファイルごとのマッチ件数を表示
git grep -c "TODO"

# マッチ箇所が属する関数名を表示
git grep -p "TODO"

実用例

TODO・FIXME コメントの棚卸し

# プロジェクト全体の TODO・FIXME コメントを列挙
git grep -n "TODO\|FIXME"

関数の使用箇所を一括確認

# "login" という関数が呼ばれている箇所を検索
git grep -n "login("

# ファイル名だけ確認したい場合
git grep -l "login("

特定のファイル種別に絞る

# JavaScript ファイルのみを対象に検索
git grep "TODO" -- "*.js"

# src/ ディレクトリのみを対象に検索
git grep "TODO" -- src/

git log -S との使い分け

コマンド何を検索するか
git grep "pattern"現在のファイル内容にパターンが含まれる箇所
git log -S "pattern"パターンが追加・削除されたコミットの履歴

現在のコードをすばやく探したいときは git grep、「いつその文字列が追加されたか」を調べたいときは git log -S を使います。

ヒント

  • git grep は追跡対象のファイルのみを検索します。git add 済みのファイルは含まれますが、未追跡ファイルは含まれません。
  • ステージング済みの内容を検索するには --cached オプションを使います:git grep --cached "pattern"
  • 正規表現を使うには -E(拡張正規表現)または -P(Perl 互換正規表現)オプションが使えます。