解説
その文字を変えたコミットはどれ?git logの-Sと-Gを使い分けよう
Gitの-Sと-Gで、文字の出現回数と一致する差分行を比較。検証済みの三コミットを使い、変更を見落とす条件と確認手順を整理する。

設定名の登場時期や、値を変えた理由を調べたいとき、現在のファイルを検索するだけでは足りない。Gitの履歴を、変更された内容から探してみよう。
今回は、文字列の出現回数の変化を見る -S と、追加・削除行を見る -G を比べる。どちらも履歴を読む操作で、作業中のファイルを書き換えないよ。
同じ文字が残る変更を、拾うかどうか
Gitの公式資料では、-S はファイル内の指定文字列の出現回数が変わる差分を探す。-G は、追加・削除行が正規表現に一致する差分を探すと説明している。
正規表現は、文字の並び方をパターンで指定する書き方。ここでは特殊な記号を使わず、どちらにも limit を渡すよ。
次の三つのコミットを作った検証用ファイルを考えてみよう。
| コミットの説明 | settings.txtの内容 | limitの回数 |
|---|---|---|
| add threshold | limit = 10 | 1 |
| change value | limit = 20 | 1 |
| rename variable | threshold = 20 | 0 |
最初の追加では、存在しなかったファイルにlimitが一つ現れる。値だけ変えた二番目では、limitの回数は変わらない。この違いが検索結果に出るんだ。
-Sでは、回数が変わった変更を探す
ターミナルで対象リポジトリのルートを開き、調べる文字とファイル名に置き換えて実行しよう。以下のファイル名とコミット名は編集部の検証用だよ。
git log --format=%s -S'limit' -- settings.txt
検証用リポジトリで得られた出力は、新しい順に次の二件。
rename variable
add threshold
change value は出ない。limitが消えたり増えたりしたのではなく、値だけ変わっているからだよ。「この単語を含む行に手が入った履歴を全部見たい」という目的だと、見落としにつながる。
-Gでは、一致する追加・削除行を探す
git log --format=%s -G'limit' -- settings.txt
同じ検証用リポジトリでは、次の三件が出る。
rename variable
change value
add threshold
二番目の変更では、削除行の limit = 10 と追加行の limit = 20 が検索条件に一致するので、-G は拾うんだ。詳しい差分を読むなら、次のように -p を付ける。
git log -p -G'limit' -- settings.txt
編集部では、分離したローカルの検証用リポジトリに三つのコミットを作り、Git 2.54.0で上記の二件・三件の違いを確認した。実際のプロジェクトで同じ出力になる、という意味ではないよ。
コミットの説明文の検索とは分ける
--format=%s は、結果としてコミットの説明文の先頭行を表示する指定。説明文を検索しているわけではない。説明文を探す --grep と、変更内容を探す -S・-G を混同しないようにしよう。
出力がない場合は、文字の大文字小文字、ファイルパス、今のブランチからたどれる履歴を確認する。-S は既定では文字列の検索で、-G は正規表現なので、記号を含む条件をそのまま共通だと考えないでね。
ファイルの名前が変わった履歴を追う疑問なら、git log --followの確認も参考になる。検索対象の範囲と、何を「変わった」と数えるかを決めてから差分を読むと、理由をたどりやすくなるよ。

みんなのコメント 0
感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。
最初のコメントをどうぞ。