Git で特定の行が追加/削除されたコミットを探す

ソースコードを追いかけていると、昔ここにあった、なかったというコードについて思いを馳せる必要があり、どのコミットで、どういう経緯で追加/削除されたのか知りたいという場面に出くわすことがある。 この場合、次のコマンドで検索文字列に掛かるコミットを検索することができる。

$ git log -S "検索文字列"

-S については、次の Git Log Searching の項で解説されている。

git-scm.com

Git Log Searching

Perhaps you’re looking not for where a term exists, but when it existed or was introduced. The git log command has a number of powerful tools for finding specific commits by the content of their messages or even the content of the diff they introduce.

If, for example, we want to find out when the ZLIB_BUF_MAX constant was originally introduced, we can use the -S option (colloquially referred to as the Git “pickaxe” option) to tell Git to show us only those commits that changed the number of occurrences of that string.

こんな具合に出力を得られる。

[13:06:28] tomoya_shibata@BPS-MBP ~/Git/demo_dir master|✓
$ git log -S "something code"
commit 27091d3adddcbc2431ba535a5e05e71e79bbb438 (HEAD -> master)
Author: tomoyashibata <dummy@example.com>
Date:   Fri Jul 17 13:05:21 2020 +0900

    5a5c2ea で追加したコードはいらなくなったので削除した

commit 5a5c2ea746fdc14c54f3ad0b4a45bae91fd72145
Author: tomoyashibata <dummy@example.com>
Date:   Fri Jul 17 13:04:32 2020 +0900

    何かのコードを追加した

関連するコミットは得られたけれど差分も眺めたい。 そういうときは -p を加える。

$ git log -p -S "検索文字列"

git-scm.com

出力はこう。

[13:06:26] tomoya_shibata@BPS-MBP ~/Git/demo_dir master|✓
$ git log -p -S "something code"
commit 27091d3adddcbc2431ba535a5e05e71e79bbb438 (HEAD -> master)
Author: tomoyashibata <dummy@example.com>
Date:   Fri Jul 17 13:05:21 2020 +0900

    5a5c2ea で追加したコードはいらなくなったので削除した

diff --git a/something.txt b/something.txt
index c9910de..e69de29 100644
--- a/something.txt
+++ b/something.txt
@@ -1 +0,0 @@
-something code
\ No newline at end of file

commit 5a5c2ea746fdc14c54f3ad0b4a45bae91fd72145
Author: tomoyashibata <dummy@example.com>
Date:   Fri Jul 17 13:04:32 2020 +0900

    何かのコードを追加した

diff --git a/something.txt b/something.txt
new file mode 100644
index 0000000..c9910de
--- /dev/null
+++ b/something.txt
@@ -0,0 +1 @@
+something code
\ No newline at end of file