Git コミットで特定の単語を grep するにはどうすればいいですか? 質問する

Git コミットで特定の単語を grep するにはどうすればいいですか? 質問する

Gitコードリポジトリで、特定の単語を含むすべてのコミットを一覧表示したい。これを試してみた

git log -p | grep --context=4 "word"

しかし、必ずしもファイル名が返されるわけではありません(検索した単語から5行以内でない限り)。また、

git grep "word"

しかし、現在のファイルのみが提供され、履歴は提供されません。

特定の単語の変更を追跡できるように、履歴全体を検索するにはどうすればよいですか? 変更を追跡するために、コードベースで単語の出現を検索するつもりです (ファイル履歴で検索)。

ベストアンサー1

コミットメッセージに特定の単語が含まれるコミットをすべて検索したい場合は、

git log --grep=word

ファイルの内容で「単語」が追加または削除されたすべてのコミット(より正確には、「単語」の出現回数が変更されたコミット)を検索する場合、つまりコミットの内容を検索する場合は、いわゆる「ピックアックス」検索を使用します。

git log -Sword

現代のGitには

git log -Gword

追加または削除された行が「単語」と一致する差異を検索します(コミット内容も)。

注意すべき点がいくつかあります:

  • -Gデフォルトでは は正規表現を受け入れ、 は-S文字列を受け入れますが、 を使用して正規表現を受け入れるように変更できます--pickaxe-regex
  • -Sは、「word」の出現回数が変更されたコミットを検索し、 は-G「word」が diff に出現するコミットを検索します。
  • つまり-S<regex> --pickaxe-regex、 と は-G<regex>まったく同じことを行わないということです。

git diffドキュメンテーションもっている素晴らしい説明違い:

-S<regex> --pickaxe-regexとの違いを説明するために-G<regex>、同じファイル内の次の diff を含むコミットを考えてみます。

+    return frotz(nitfol, two->ptr, 1, 0);
...
-    hit = frotz(nitfol, mf2.ptr, 1, 0);

ではgit log -G"frotz\(nitfol"このコミットが表示されますが、git log -S"frotz\(nitfol" --pickaxe-regexは表示されません (その文字列の出現回数は変更されていないため)。

これにより、検索用語を含むコミットが表示されますが、代わりにそれらのコミットの実際の変更を確認したい場合は、次を使用できます--patch

git log -G"searchTerm" --patch

これをパイプして、その検索語を含むコミットの diff 行のみを表示するように出力を分離することができますgrep。一般的な使用例は、特定のコミット以降のコミットでその検索語を含む diff 行を表示することです。3b5ab0f2a1この例では、次のようになります。

git log 3b5ab0f2a1^.. -G"searchTerm" --patch | grep searchTerm

おすすめ記事