git の履歴を柔軟に検索する

git の履歴検索における tips です。

差分にある文字列が存在するコミットの検索

文字列 hoge が差分に存在するコミットを探すには、-S オプションを使います。

$ git log -Shoge

正規表現を利用する

正規表現を使いたい場合、-G オプションが利用できます。1
以下は文字列 foobar が差分に存在するコミットを検索する例です。

$ git log -G'foo|bar'

検索文字列が追加・削除・変更されたコミットをみつける

やや特殊なケースですが、検索文字列自体が追加・削除・変更されたコミット を表示したいケースでは、 --pickaxe-all--pickaxe-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 では検索できません。

なぜなら、検索対象パターンとなる frotz(nitfol という 文字列自体の出現回数が変わった(文字列が変更された)わけではない からです。

ある範囲の検索を行う

あるソースコードの特定範囲だけを検索したい 場合は、-L オプションを利用できます。このオプションは、複数回指定できます。

行番号の指定

foo.js の 10 行目から 15 行目までの差分履歴は、次のように表示できます。

$ git log -L10,15:foo.js

-L オプションを利用した場合、デフォルトで --patch オプション 2 3 も有効化されます。

上の例では、始まり から 終わり までの行番号を絶対値で入力しましたが、 終わり の行番号は 相対値(オフセット)で入力することもできます

$ git log -L10,+5:foo.js

負の値も指定可能です。

$ git log -L15,-5:foo.js

正規表現での範囲指定

-L オプションは正規表現も利用できます。hoge で始まる行から、空行までを検索範囲としたい場合、次のようになります。

$ git log -L'/^hoge/,/^$/:foo.js'

関数の履歴

ある関数 hoge_func 内の履歴だけ知りたい場合は、次のように :hoge_func と指定します。

$ git log -L':hoge_func:foo.js'

言語によって関数はうまく認識できないことがあります。

この場合前述のように正規表現を利用するか、hunc-header の設定 を行ってください。

参考


  1. Perl 互換の正規表現を利用したい場合には -P オプションを利用します。ただし、パフォーマンスが下がることがあります。↩︎

  2. コミット情報だけでなく、差分も表示するオプションです。↩︎

  3. --no-patch オプションで無効化できます。↩︎

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

seventeen + 3 =