[解決済み] Gitのコミットの差分や内容を特定の単語でgrepする方法
質問
Git のコード・リポジトリで、ある単語を含むすべてのコミットをリストアップしたいのです。試してみたところ、次のようになりました。
git log -p | grep --context=4 "word"
が、必ずしもファイル名を返してくれるとは限りません(検索した単語から5行以内であれば別ですが)。また
git grep "word"
が、現在のファイルだけが表示され、履歴は表示されません。
特定の単語の変更を追跡するために、履歴全体を検索するにはどうすればよいですか?私は、変更を追跡するために、コードベースでその単語の出現を検索するつもりです(ファイルの履歴で検索)。
どのように解決するのですか?
のあるすべてのコミットを見つけたい場合、そのコミットには コミットメッセージ が指定された単語を含んでいる場合
$ git log --grep=word
で "word" が追加または削除されたすべてのコミットを見つけたい場合は、次のようにします。 ファイルコンテンツ (正確には、"word" の出現回数が変化したところ) を検索する、つまり コミット内容 で、いわゆる「ツルハシ」検索をします。
$ git log -Sword
最近のGitでは、さらに
$ git log -Gword
を探します。 相違点 追加または削除された行が "word"に一致する場合 (さらに コミット内容 ).
なお
-G
はデフォルトで正規表現を受け付けますが
-S
は文字列を受け入れますが、正規表現を受け入れるように
--pickaxe-regex
.
との違いを説明するために
-S<regex> --pickaxe-regex
と
-G<regex>
の場合、同じファイルに以下のような差分があるコミットを考えます。
+ return !regexec(regexp, two->ptr, 1, ®match, 0);
...
- hit = !regexec(regexp, mf2.ptr, 1, ®match, 0);
一方
git log -G"regexec\(regexp"
はこのコミットを表示します。git log -S"regexec\(regexp" --pickaxe-regex
という文字列の出現回数は変更されていないため、変更されません。
Git 2.25.1 (Feb 2020) では、これらの正規表現に関するドキュメントが明確化されています。
参照
コミット 9299f84
(2020年02月06日)によるものです。
マーティン・オーグレン (``)
.
(によって統合されました。
ジュニオ・C・ハマノ--。
gitster
--
で
コミット 0d11410
, 2020年2月12日)
diff-options.txt
この例では、quot;regex" のオーバーロードを回避してください。
Reported-by: Adam Dinwoodie
サインオフ:Martin Ågren
レビュー執筆者:Taylor Blau
との違いを例証すると
-G
と
-S
(を使用)。
--pickaxe-regex
) を使って行うのですが、例としてdiffと
git diff
regexec", "regexp", "regmatch" 等を含む呼び出しを行います。
この例は正しいのですが、自分の主張を伝えるために本当に必要な場合以外は "regex.*" と書かないようにすることで、より簡単に解きほぐすことができます。
<ブロッククオートレジーでない、でっち上げの言葉を使いましょう。
は
git diff
ドキュメンテーション
が含まれるようになりました。
との違いを説明するために
-S<regex> --pickaxe-regex
と-G<regex>
の場合、同じファイルに以下のような差分があるコミットを考えます。
+ return frotz(nitfol, two->ptr, 1, 0);
...
- hit = frotz(nitfol, mf2.ptr, 1, 0);
一方
git log -G"frotz\(nitfol"
はこのコミットを表示します。git log -S"frotz\(nitfol" --pickaxe-regex
という文字列の出現回数は変更されていないため、変更されません。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] 既存の、プッシュされていないコミットメッセージを修正するには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git サブモジュール head 'reference is not a tree' エラー
-
[解決済み】ERROR: Error cloning remote repo 'origin'.
-
[解決済み】Git Push Error: リポジトリデータベースにオブジェクトを追加する権限が不足しています。
-
[解決済み] GIT_DISCOVERY_ACROSS_FILESYSTEM が設定されていない。
-
[解決済み] Gitの履歴からコミットしたコードをgrep(検索)する方法
-
[解決済み] Git の全履歴からある文字列を検索する [重複] 。
-
[解決済み] 任意のブランチで文字列を導入した Git コミットを見つけるには?
-
[解決済み] Git の履歴から機密性の高いファイルやそのコミットを削除する
-
[解決済み】コミットメッセージでGitリポジトリを検索する方法とは?
-
[解決済み】リポジトリ内のすべてのGitとMercurialのコミットで、特定の文字列を検索するには?