git grep
Gitが管理するファイル内のテキストをパターン検索します。ブランチやコミットを指定して検索することも可能です。
構文
git grep [options] <pattern> [<tree-ish>...] [[--] <pathspec>...] 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 互換正規表現)オプションが使えます。