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

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

```

    git log -p | grep <pattern>
    
```

をやってみましたが、コミットのハッシュかもすぐに分からず、あまり使えません。
CC BY-SA 3.0
2014-12-08T04:38:27.463
438
2014-12-08T07:07:44.750
2017-05-23T12:38:56.467
-1
41
question
git grep
Gitでソースコードのコミット履歴を検索する方法
```

    git log --grep keyword
    
```

でコミットログに"keyword"を含むものを抽出できます。

コミットメッセージにRedmineなどのチケット番号を入れるルールで開発している場合は、

```

    git log --grep #1111
    
```
CC BY-SA 3.0
2014-12-08T05:18:29.813
439
2014-12-08T05:18:29.813
525
438
answer
消してしまった履歴をコミットしたかどうかにもよりますが…

ファイルシステム上で rm しただけならば、git はワークツリーでの作業としてそれを記録するため、unstaged な履歴があることを git
status で検知できます。

git rm した場合は、git は staged な履歴としてファイルの消去を扱うので、これもコミットしなければstaged な履歴があることを git
status で検知できます。

もしファイルの消去をコミットしてしまった場合はいくつかパターンがありますが、最新のコミットでなおかつ push していない場合は、git reset
HEAD^ で最新のコミットを取り消すことができます。これで、間違えて消したものを戻すことができます。

もしファイルのパスがはっきりしているのであれば、git log --stat
で、コミットごとにどのファイルにどの程度の差分ができたかを閲覧できるので、この中から探せますね。
CC BY-SA 3.0
2014-12-08T05:20:01.320
440
2014-12-08T05:20:01.320
484
438
answer
質問同様 [本家SOについた回答](https://stackoverflow.com/questions/2928584/how-to-grep-
search-committed-code-in-the-git-
history#)よりコミットされた物（例えば実際のソースの行や、コミットメッセージなど）を検索する方法を説明します。

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

```

    git grep <regexp> $(git rev-list --all)
    
```

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

  

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

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

```

    git grep <regexp>
    
```

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

```

    git grep -e <regexp1> [--or] -e <regexp2>
    
```

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

```

    git grep -e <regexp1> --and -e <regexp2>
    
```

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

```

    git grep -l --all-match -e <regexp1> -e <regexp2>
    
```

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

```

    git grep <regexp> $(git rev-list --all)
    
```

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

```

    git grep <regexp> $(git rev-list <rev1>..<rev2>)
    
```

* * *

[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>`
の事だと思われるのでそれについてはこちらで修正しています。
CC BY-SA 3.0
2014-12-08T05:50:22.957
443
2014-12-08T07:07:44.750
2020-06-17T08:14:45.997
-1
728
438
answer