1. ホーム
  2. git

[解決済み] Gitのコミットの差分や内容を特定の単語でgrepする方法

2022-03-14 11:51:50

質問

Git のコード・リポジトリで、ある単語を含むすべてのコミットをリストアップしたいのです。試してみたところ、次のようになりました。

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

が、必ずしもファイル名を返してくれるとは限りません(検索した単語から5行以内であれば別ですが)。また

git grep "word"

が、現在のファイルだけが表示され、履歴は表示されません。

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

どのように解決するのですか?

のあるすべてのコミットを見つけたい場合、そのコミットには コミットメッセージ が指定された単語を含んでいる場合

$ git log --grep=word

で "word" が追加または削除されたすべてのコミットを見つけたい場合は、次のようにします。 ファイルコンテンツ (正確には、"word" の出現回数が変化したところ) を検索する、つまり コミット内容 で、いわゆる「ツルハシ」検索をします。

$ git log -Sword

最近のGitでは、さらに

$ git log -Gword

を探します。 相違点 追加または削除された行が "word"に一致する場合 (さらに コミット内容 ).

なお -G はデフォルトで正規表現を受け付けますが -S は文字列を受け入れますが、正規表現を受け入れるように --pickaxe-regex .

<ブロッククオート

との違いを説明するために -S<regex> --pickaxe-regex-G<regex> の場合、同じファイルに以下のような差分があるコミットを考えます。

+    return !regexec(regexp, two->ptr, 1, &regmatch, 0);
...
-    hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0);

一方 git log -G"regexec\(regexp" はこのコミットを表示します。 git log -S"regexec\(regexp" --pickaxe-regex という文字列の出現回数は変更されていないため、変更されません。


Git 2.25.1 (Feb 2020) では、これらの正規表現に関するドキュメントが明確化されています。

参照 コミット 9299f84 (2020年02月06日)によるものです。 マーティン・オーグレン (``) . (によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット 0d11410 , 2020年2月12日)

<ブロッククオート

diff-options.txt この例では、quot;regex" のオーバーロードを回避してください。

Reported-by: Adam Dinwoodie
サインオフ:Martin Ågren
レビュー執筆者:Taylor Blau

<ブロッククオート

との違いを例証すると -G-S (を使用)。 --pickaxe-regex ) を使って行うのですが、例としてdiffと git diff regexec", "regexp", "regmatch" 等を含む呼び出しを行います。

<ブロッククオート

この例は正しいのですが、自分の主張を伝えるために本当に必要な場合以外は "regex.*" と書かないようにすることで、より簡単に解きほぐすことができます。

<ブロッククオート

レジーでない、でっち上げの言葉を使いましょう。

git diff ドキュメンテーション が含まれるようになりました。

との違いを説明するために -S<regex> --pickaxe-regex-G<regex> の場合、同じファイルに以下のような差分があるコミットを考えます。

+    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 という文字列の出現回数は変更されていないため、変更されません。