0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

あの設定値はいつ消えた? git log -Sで文字列が増減したコミットを探す

0
Posted at

前は確かにあった RETRY_LIMIT という設定が、いまのコードには見当たらない。いつ、どのコミットで消えたのかを知りたい。そんなときは、git log を上から1件ずつ読む前に git log -S で「その文字列の数が変わったコミット」だけに絞り込みます。

初心者向けに、正規表現の細かい書き方やオプションの組み合わせは省略します。git log と git show を使ったことがある方向けの、履歴から文字列を探す小ネタです。

確認用の履歴

確認用の一時リポジトリで git log --oneline を実行すると、次の5コミットが並びます。

7fcd99b 設定を整理
da27121 main.pyを追加
d12b033 リトライ上限を5回へ変更
71cee55 リトライ上限を追加
1e4fef8 設定ファイルを追加

config.py には、71cee55 で RETRY_LIMIT = 3 の行を追加し、d12b033 で値を 5 に書き換え、7fcd99b でその行を削除しました。da27121 は別ファイルの追加で、config.py には触れていません。

いまの config.py には TIMEOUT_SEC = 10 の1行しかなく、git grep RETRY_LIMIT で探しても何も見つかりません。現在のファイルにない文字列なので、履歴のほうを探します。

git log -Sで、追加と削除のコミットを探す

git log -S RETRY_LIMIT --oneline

出力は次のとおりです。

7fcd99b 設定を整理
71cee55 リトライ上限を追加

-S は、指定した文字列の 出現回数が変わったコミット を表示するオプションです。Gitの資料では「pickaxe(つるはし)」と呼ばれています。RETRY_LIMIT が0回から1回になった追加のコミットと、1回から0回になった削除のコミットだけが出てきました。

探していた「いつ消えたか」は、新しい側の 7fcd99b です。中身まで見たいときは -p を付けると差分も表示されます。

git log -S RETRY_LIMIT -p -1
diff --git a/config.py b/config.py
index 3e34784..f09a3d4 100644
--- a/config.py
+++ b/config.py
@@ -1,2 +1 @@
 TIMEOUT_SEC = 10
-RETRY_LIMIT = 5

コミット情報の行は省略しています。-1 は表示件数を1件に絞る指定で、新しい順の先頭、つまり削除したコミットだけを表示しています。

値を書き換えたコミットは-Sに出てこない

上の結果には、3 を 5 に書き換えた d12b033 がありません。この変更では RETRY_LIMIT の行が1行消えて1行増えたので、文字列の出現回数は1回のまま変わっていないためです。

-S は「増えた・減った」を探すもので、「その文字列を含む行が変わった」を探すものではありません。 書き換えも含めて探したいときは -G を使います。

git log -G RETRY_LIMIT --oneline
7fcd99b 設定を整理
d12b033 リトライ上限を5回へ変更
71cee55 リトライ上限を追加

-G は、追加または削除された行が、指定した正規表現に一致するコミットを表示します。今回は書き換えのコミットも出てきました。

使い分けは、次のように考えると迷いにくいです。

  • いつ追加されたか、いつ消えたかを知りたい: -S
  • 値の変更も含めて、その文字列に関わった変更をたどりたい: -G

何も出ないときの確認

存在しない文字列を -S で探すと、何も表示されずに終了します。今回の確認では、このときの終了コードは 0 でした。git grep のように「見つからなかったら終了コード 1」にはならないので、スクリプトで判定するときは出力が空かどうかを見ます。

何も出ないときは、次の2点を疑います。

  • 大文字・小文字やスペースを含めて、文字列を正確に書いているか
  • 末尾に -- ファイル名 を付けて、対象外のファイルに絞り込んでいないか

絞り込み自体は便利です。git log -S RETRY_LIMIT --oneline -- config.py のように対象ファイルを指定すると、そのファイルの変更だけから探せます。今回の例では、絞り込まないときと同じ2件が表示されました。

消えたコードを探すときは、まず git log -S 文字列 --oneline で追加と削除のコミットを見つけ、値の変更まで追いたくなったら -G に切り替えます。どちらも差分の中身で絞り込むので、コミットメッセージに文字列が書かれていなくても見つけられます。

確認環境・参考資料

2026年11月、Windows/Git Bash/Git 2.54.0.windows.1 の一時リポジトリで確認しました。上記の5コミットを作り、-S と -G の表示の違い、-- config.py を付けたときの表示、存在しない文字列での無出力と終了コード 0、git grep で現在のファイルに文字列がないことを確認しています。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?