まくまくGitノート
Git で変更内容にある文字列が含まれているコミットを検索する (git log -G/-S)
2020-12-22

ソースコードのある行の変更がなぜ行われたかを調べるには git blame コマンドが便利で、指定したファイルに関して行単位の変更者(とコミットメッセージ)を確認することができます。 ただし、git blame では直近の変更しか調べられないため、もっと前のコミット履歴まで遡って変更者を確認することはできません。 例えば、リファクタで関数を別クラスに移動させた場合は、git blame ではリファクタを行った人の名前が見えてしまいます。

そんなときは、git log コマンドの -G オプションや -S オプションを使用すると、すべてのコミットのソースコードの変更内容を検索することができます。

$ git log -G"正規表現"
$ git log -S"文字列"
$ git log -S"正規表現" --pickaxe-regex

git log -G(変更内容の検索)

例えば、ソースコードの変更内容(追加行 or 削除行)に、xxxYyyZzz が含まれているコミットを検索したいのであれば、git log-G オプションを使って次のようにします。

例: 変更内容に xxxYyyZzz が含まれているコミットを探す

$ git log -G"xxxYyyZzz"

実際の変更行まで表示したいのであれば、git log-p オプションも指定します。 じっくり見たいのであれば、ファイルにリダイレクトしてしまうのもよいです。

$ git log -G"xxxYyyZzz" -p > log.txt

-G オプションで指定する文字列は、正規表現として扱われます。 例えば、次のようにすると image012 などの変更内容にヒットします。

$ git log -G"image[0-9]+"

git log -S(pickaxe 検索)

-S オプションは、-G オプションとはちょっと異なり、指定した単語で検索したときの 追加行と変更行の数が異なる コミットのみ検索します。 つまり、-S オプションの方を使えば、ある名前の関数が初めて追加されたコミットだけを効率的に探すことができます(リファクタで関数を移動しただけの場合は、追加行と変更行の数が等しくなるのでヒットしなくなる)。

例: 初めて xxxYyyZzz が追加されたコミットを探す

$ git log -S"xxxYyyZzz"

-S オプションで指定する文字列を正規表現として扱いたいときは --pickaxe-regex を一緒に指定する必要があることに注意してください(この辺りは -G オプションと微妙に振る舞いが異なります)。

参考

ソースコードの変更内容ではなく、コミット時の「コミットメッセージ」の内容を検索したいときは、--grep オプションを使用します。

2020-12-22