ソースコードのある行の変更がなぜ行われたかを調べるには git blame
コマンドが便利で、指定したファイルに関して行単位の変更者(とコミットメッセージ)を確認することができます。
ただし、git blame
では直近の変更しか調べられないため、もっと前のコミット履歴まで遡って変更者を確認することはできません。
例えば、リファクタで関数を別クラスに移動させた場合は、git blame
ではリファクタを行った人の名前が見えてしまいます。
そんなときは、git log
コマンドの -G
オプションや -S
オプションを使用すると、すべてのコミットのソースコードの変更内容を検索することができます。
$ git log -G"正規表現"
$ git log -S"文字列"
$ git log -S"正規表現" --pickaxe-regex
例えば、ソースコードの変更内容(追加行 or 削除行)に、xxxYyyZzz
が含まれているコミットを検索したいのであれば、git log
の -G
オプションを使って次のようにします。
$ git log -G"xxxYyyZzz"
実際の変更行まで表示したいのであれば、git log
の -p
オプションも指定します。
じっくり見たいのであれば、ファイルにリダイレクトしてしまうのもよいです。
$ git log -G"xxxYyyZzz" -p > log.txt
-G
オプションで指定する文字列は、正規表現として扱われます。
例えば、次のようにすると image012
などの変更内容にヒットします。
$ git log -G"image[0-9]+"
-S
オプションは、-G
オプションとはちょっと異なり、指定した単語で検索したときの 追加行と変更行の数が異なる コミットのみ検索します。
つまり、-S
オプションの方を使えば、ある名前の関数が初めて追加されたコミットだけを効率的に探すことができます(リファクタで関数を移動しただけの場合は、追加行と変更行の数が等しくなるのでヒットしなくなる)。
$ git log -S"xxxYyyZzz"
-S
オプションで指定する文字列を正規表現として扱いたいときは --pickaxe-regex
を一緒に指定する必要があることに注意してください(この辺りは -G
オプションと微妙に振る舞いが異なります)。
ソースコードの変更内容ではなく、コミット時の「コミットメッセージ」の内容を検索したいときは、--grep
オプションを使用します。