Gitでソースコードのコミット履歴を検索する方法


[本家SOより](https://stackoverflow.com/questions/2928584/how-to-grep-search-
committed-code-in-the-git-history)

`Git`で`git log
-p`を使うと、コミットログと一緒に、コードの差分が表示されると思うのですが、このコードのコミット履歴を使って、検索するにはどうしたらいいですか？

[code]

    git log -p | grep <pattern>
    
[/code]

をやってみましたが、コミットのハッシュかもすぐに分からず、あまり使えません。




質問同様 [本家SOについた回答](https://stackoverflow.com/questions/2928584/how-to-grep-
search-committed-code-in-the-git-
history#)よりコミットされた物（例えば実際のソースの行や、コミットメッセージなど）を検索する方法を説明します。

## すべてのコミットテキストを正規表現でgrepする検索方法

[code]

    git grep <regexp> $(git rev-list --all)
    
[/code]

（追記: もし "`Argument list too long`"（引数リストが長すぎます）というエラーが発生する場合は  
`git rev-list --all | xargs git grep expression` を使えば上手いくと思います）

  

## コードを検索する上でその他の便利な方法

ワーキングツリーを正規表現 `<regexp>` でテキストマッチ検索:

[code]

    git grep <regexp>
    
[/code]

ワーキングツリーを正規表現 `<regexp1>` または `<regexp2>` がマッチする行のテキストマッチ検索:

[code]

    git grep -e <regexp1> [--or] -e <regexp2>
    
[/code]

ワーキングツリーを正規表現 `<regexp1>` も `<regexp2>` もマッチする行のテキストマッチ検索:

[code]

    git grep -e <regexp1> --and -e <regexp2>
    
[/code]

ワーキングツリーの中で正規表現`<regexp1>`にテキストマッチする行と正規表現`<regexp2>`にテキストマッチする行を持つファイルを検索し、ファイルパスのみ報告：

[code]

    git grep -l --all-match -e <regexp1> -e <regexp2>
    
[/code]

全てのリビジョンを正規表現`<regexp>`でテキストマッチ検索：

[code]

    git grep <regexp> $(git rev-list --all)
    
[/code]

`<rev1>` から `<rev2>` の間の全てのリビジョンを正規表現`<regexp>`でテキストマッチ検索：

[code]

    git grep <regexp> $(git rev-list <rev1>..<rev2>)
    
[/code]

* * *

[jeet](https://stackoverflow.com/users/268330/jeet)による[stackoverflow.comの回答](https://stackoverflow.com/questions/2928584/how-
to-grep-search-committed-code-in-the-git-history#)より。  
xargs を用いる更新部分は[Casebash](https://stackoverflow.com/users/268330/jeet)による補足。

ファイルパスのみ報告するのは `git grep -l --all-match -e <regexp1> -e <regexp2>`
の事だと思われるのでそれについてはこちらで修正しています。




質問同様 [本家SOについた回答](https://stackoverflow.com/questions/2928584/how-to-grep-
search-committed-code-in-the-git-
history#)よりコミットされた物（例えば実際のソースの行や、コミットメッセージなど）を検索する方法を説明します。

## すべてのコミットテキストを正規表現でgrepする検索方法

[code]

    git grep <regexp> $(git rev-list --all)
    
[/code]

（追記: もし "`Argument list too long`"（引数リストが長すぎます）というエラーが発生する場合は  
`git rev-list --all | xargs git grep expression` を使えば上手いくと思います）

  

## コードを検索する上でその他の便利な方法

ワーキングツリーを正規表現 `<regexp>` でテキストマッチ検索:

[code]

    git grep <regexp>
    
[/code]

ワーキングツリーを正規表現 `<regexp1>` または `<regexp2>` がマッチする行のテキストマッチ検索:

[code]

    git grep -e <regexp1> [--or] -e <regexp2>
    
[/code]

ワーキングツリーを正規表現 `<regexp1>` も `<regexp2>` もマッチする行のテキストマッチ検索:

[code]

    git grep -e <regexp1> --and -e <regexp2>
    
[/code]

ワーキングツリーの中で正規表現`<regexp1>`にテキストマッチする行と正規表現`<regexp2>`にテキストマッチする行を持つファイルを検索し、ファイルパスのみ報告：

[code]

    git grep -l --all-match -e <regexp1> -e <regexp2>
    
[/code]

全てのリビジョンを正規表現`<regexp>`でテキストマッチ検索：

[code]

    git grep <regexp> $(git rev-list --all)
    
[/code]

`<rev1>` から `<rev2>` の間の全てのリビジョンを正規表現`<regexp>`でテキストマッチ検索：

[code]

    git grep <regexp> $(git rev-list <rev1>..<rev2>)
    
[/code]

* * *

[jeet](https://stackoverflow.com/users/268330/jeet)による[stackoverflow.comの回答](https://stackoverflow.com/questions/2928584/how-
to-grep-search-committed-code-in-the-git-history#)より。  
xargs を用いる更新部分は[Casebash](https://stackoverflow.com/users/268330/jeet)による補足。

ファイルパスのみ報告するのは `git grep -l --all-match -e <regexp1> -e <regexp2>`
の事だと思われるのでそれについてはこちらで修正しています。

