25

タイトルが示すように、差分に特定の文字列が含まれているすべてのコミットを見つけたいと考えています。

現時点では、私は使用します

git log -p 'filename'

これは、文字列を検索するすべての差分のインターフェイスにあまり似ていません。次に、バックトレースして実際のコミット メッセージを見つけます。

簡単な代替手段は git log -p を grep にパイプすることかもしれませんが、その方法でコミット ID またはメッセージを見つけることができません。

4

7 に答える 7

30
git log -p -S'string'

文字列を追加または削除するコミットを検索するために使用できます。パターンのインスタンスを実際に追加または削除するコミットのみに一致し、(たとえば) diff コンテキストで発生するコミットには一致しないため、まったく同じようには動作しません。でも、それで十分なのかもしれません。

于 2013-08-21T19:28:44.607 に答える
15

これは、指定されpathた. 完璧ではありません (コミット メッセージと差分に一致します) が、ここから好きなように簡単に微調整できるはずです。git show -ppattern

git rev-list HEAD -- path |
while read rev; do
    if git show -p $rev | grep pattern >/dev/null; then
        echo $rev
    fi
done

git showたとえば、git diff $rev^ $rev(マージの場合、これは最初の親とのみ比較されることに注意してください)、またはgit whatchanged $rev、または好きなものに置き換えることができることに注意してください。主なトリックは、git rev-listすべての候補を抽出することから始めることです (指定されたパスに影響を与えるコミット;-- pathから始まるすべてのコミットを取得する部分を省略しますHEAD)。でできる他の多くのことについては、 git-rev-list(1)を参照してくださいgit rev-list

于 2013-08-21T18:35:21.970 に答える
13

この質問にはしばらく回答があったことは知っていますが、これにも出くわし、別の解決策を見つけたので、共有したいと思いました。Git-log-Gスイッチは、あなたが求めていることを実行する必要があります。ここで、-Sスイッチは、一致した文字列の出現回数が変化するコミットのみを出力します。

git-logの man ページから:

-G に一致する追加/削除された行を含むパッチ テキストの違いを探します。

-S --pickaxe-regex と -G の違いを説明するために、同じファイルに次の差分があるコミットを考えてみましょう。

+    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 は表示しません (その文字列の出現回数が変更されていないため)。

詳細については、gitdiffcore(7) のつるはしのエントリを参照してください。

于 2014-10-13T10:12:38.033 に答える
-1

たとえば、次のように git を使用できます。

git log --grep="filename"

または特定のファイルで:

git log --grep="filename" README
于 2013-08-21T17:48:05.307 に答える
-1

パイプとgrepコマンドの使用を検討しましたか?

例:

 git log -p | grep 'filename'
于 2013-08-21T17:44:02.503 に答える