[解決済み] Gitの履歴からコミットしたコードをgrep(検索)する方法
質問
過去にファイルやファイル内のコードを削除したことがあります。コミットメッセージではなく、その内容をgrepすることは可能でしょうか?
非常に悪い解決策は、ログを grep することです。
git log -p | grep <pattern>
しかし、これではコミットハッシュがすぐに返ってきません。そこで
git grep
を実行しても無駄です。
解決方法は?
コミットを検索するには コンテンツ (つまり、コミットメッセージなどとは対照的な、ソースの実際の行) を実行する必要があります。
git grep <regexp> $(git rev-list --all)
git rev-list --all | xargs git grep <expression>
は、"Argument list too long"エラーに遭遇した場合、動作します。
検索対象をサブツリー (たとえば "lib/util") に限定したい場合は、そのサブツリーを
rev-list
サブコマンドと
grep
にも対応しています。
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
これは、すべてのコミットテキストを grep して
regexp
.
両方のコマンドでパスを渡す理由は、以下の通りです。
rev-list
に対するすべての変更が含まれるリビジョンリストを返します。
lib/util
に渡す必要があります。
grep
のみを検索するようにします。
lib/util
.
ただ、次のようなシナリオを想像してみてください。
grep
は、同じ
<regexp>
が返す同じリビジョンに含まれる他のファイル上で
rev-list
(たとえそのリビジョンでそのファイルに変更がなかったとしても)。
その他、ソースを検索するのに便利な方法を紹介します。
正規表現regexpにマッチするテキストを作業ツリーで検索します。
git grep <regexp>
正規表現 regexp1 または regexp2 にマッチするテキスト行を作業ツリーに検索します。
git grep -e <regexp1> [--or] -e <regexp2>
正規表現 regexp1 と regexp2 に一致するテキスト行を作業ツリーに検索し、ファイルパスのみを報告する。
git grep -l -e <regexp1> --and -e <regexp2>
正規表現regexp1にマッチするテキスト行と正規表現regexp2にマッチするテキスト行を持つファイルを作業ツリーから検索します。
git grep -l --all-match -e <regexp1> -e <regexp2>
作業木を検索して、パターンに一致する変更されたテキスト行を探す。
git diff --unified=0 | grep <pattern>
正規表現 regexp に一致するテキストをすべてのリビジョンで検索します。
git grep <regexp> $(git rev-list --all)
正規表現 regexp に一致するテキストについて、rev1 と rev2 の間のすべてのリビジョンを検索します。
git grep <regexp> $(git rev-list <rev1>..<rev2>)
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルの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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] LFはgitでCRLFに置き換えられます - それは何ですか、そしてそれは重要ですか?[重複]。
-
[解決済み] このリポジトリで別の git プロセスが実行されているようです。
-
[解決済み] 短いGitバージョンのハッシュを取得する
-
[解決済み] Git エラー : 'upstream' は git リポジトリでないようです。
-
[解決済み] Gitのコミットの差分や内容を特定の単語でgrepする方法
-
[解決済み】Githubプロジェクト内のコードを検索する
-
[解決済み】Gitを使用して、すべてのブランチにまたがって文字列を検索するにはどうすればよいですか?
-
[解決済み] Git プロジェクトのすべてのブランチで「grep 検索」を実行することはできますか?
-
[解決済み] git logで特定のパスの変更を無視するようにする
-
[解決済み] サブバージョン履歴の検索(全文)