GitHubで特定文字列を変更したコミットとPRを特定する方法:git log -S の使い方

スポンサーリンク

「config.yaml の API_KEY をいつ誰が変更したか知りたい」「README の特定の文言がどのPRで消えたか追いたい」といった場面で、git log -S を使うと特定文字列を追加・削除したコミットを素早く特定できます。

git log -S で文字列変更を含むコミットを探す

-S オプションは、指定した文字列を追加または削除したコミットを抽出します。

git log -S "検索したい文字列" -- path/to/file

例:config.yaml の API_KEY 変更履歴を探す

git log -S "API_KEY" -- config.yaml

ファイルパスを省略すると全ファイルを対象にします。

変更の中身も確認する

-p を追加すると差分も表示されます。

git log -S "API_KEY" -p -- config.yaml

正規表現で検索する(-G オプション)

git log -G "API_KEY.*prod" -- config.yaml

-S は文字列の個数の変化を検知するのに対し、-G はdiff全体に正規表現でマッチします。

特定コミットのPRを確認する

GitHub Web UI

コミットページの右サイドバーに "This commit is part of pull request #xxx" が表示されます。

GitHub CLI

gh pr list --search "<commit-sha>" --state all

GraphQL API

{
  repository(owner: "org", name: "repo") {
    object(expression: "コミットSHA") {
      ... on Commit {
        associatedPullRequests(first: 5) {
          nodes {
            number
            title
            url
          }
        }
      }
    }
  }
}

実務での流れ

# 1. 文字列変更を含むコミットを特定
git log -S "検索文字列" -- path/to/file

# 2. 差分を確認
git show <commit-sha>

# 3. PRを確認
gh pr list --search "<commit-sha>" --state all

注意点

  • -S は文字列の個数変化を検知。単に含まれているだけではヒットしない
  • squash merge で取り込まれた場合、個別コミットではなくまとめられたコミットでしか追えない
  • ファイルパスを省略すると全ファイルが対象になり結果が多くなる

まとめ

# 特定文字列を変更したコミットを探す
git log -S "検索文字列" -- ファイルパス

# 差分も表示
git log -S "検索文字列" -p -- ファイルパス

# 正規表現で探す
git log -G "正規表現" -- ファイルパス

Gitのよく使うコマンド・操作まとめは「Git & GitHub Tips集:知っておくと便利なコマンド・操作まとめ」を参照してください。

GitHubのコミットに署名してVerifiedバッジを付ける方法は「GitHubで署名付きコミットを設定する:SSH署名でVerifiedバッジを付ける」を参照してください。