DESIGN / CODE / INFRA / AI

解説

その文字を変えたコミットはどれ?git logの-Sと-Gを使い分けよう

Gitの-Sと-Gで、文字の出現回数と一致する差分行を比較。検証済みの三コミットを使い、変更を見落とす条件と確認手順を整理する。

その文字を変えたコミットはどれ?git logの-Sと-Gを使い分けよう
保存リストを見る →
この記事の道しるべ 4項目

設定名の登場時期や、値を変えた理由を調べたいとき、現在のファイルを検索するだけでは足りない。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

感想や、試してみたことを聞かせてね。コメント・返信は承認後に公開されます。

最初のコメントをどうぞ。