派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

第12話 git grepと普通のgrepってどう違うの?【連載】マンガでわかるGit ~コマンド編~

f:id:itstaffing:20200514133141j:plain

Webサービスやアプリ開発の現場では必須のバージョン管理システム「Git(ギット)」。Gitは、専用のソフトを使えばクリックで直感的に操作することもできますが、いざというときにコマンドが使えると便利です。

前回の 第11話 では、編集中のファイルを一時退避することができる「stash」について学びました。

・スタッシュを保存する

$ git stash save

・保存したリストを見る

$ git stash list

・スタッシュの復活と削除を同時に行う

$ git stash pop [スタッシュ名]

今回の第12話では、リポジトリ内の検索ができる「git grep(グレップ)」の使い方を学びます。このマンガを通して、わかばちゃんと一緒にGitの知識を身につけていきましょう!

【筆者】湊川 あいさん
【筆者】湊川 あいさん
フリーランスのWebデザイナー・漫画家・イラストレーター。マンガと図解で、技術をわかりやすく伝えることが好き。 著書『わかばちゃんと学ぶGit使い方入門』・『わかばちゃんと学ぶ Googleアナリティクス』・『わかばちゃんと学ぶ Webサイト制作の基本』『運用ちゃんと学ぶ』が発売中のほか、マンガでわかるGit・マンガでわかるDocker・マンガでわかるRuby・マンガでわかるScrapbox・マンガでわかるLINE Clova開発・マンガでわかる衛星データ活用といった分野横断的なコンテンツを展開している。

・Amazon著者ページ
・Twitterアカウント

git grepと普通のgrepってどう違うの?

f:id:itstaffing:20200514133144j:plain
f:id:itstaffing:20200514133147j:plain
 
f:id:itstaffing:20190617145538j:plain
ところでgrepって何の略なんでしょうね?
f:id:itstaffing:20190617145541j:plain
global・regular expression・print の頭文字をとったものらしいぞ。「ファイル全体から・正規表現で・表示する」ってわけだな。

git grepと普通のgrepの違い

「git grep コマンドを使わなくても、Linux の grep コマンドがあるからそれを使えばいいじゃない」と思いますよね。改めて、普通の grepコマンドとの違いをご紹介します。

git grep コマンドが持つメリットは次の3点です。

1.リポジトリ内のみを検索するため、Linuxのgrepコマンドよりも検索速度が速い

ただし、あらかじめ $ cd コマンドで、リポジトリのディレクトリに移動しておく必要があります。

2.リポジトリ内で追跡しているファイルのみを対象に検索ができる

普通のgrepだと、キャッシュなどの必要ないファイルも検索対象になってしまいます。ところが git grep は、追跡中のファイルのみを対象にして検索することができます。

※ちなみに --untracked オプションをつけると、.gitignore に載っているファイルも合わせて検索できます

 
f:id:itstaffing:20190617145538j:plain
「追跡中のファイルってなんだっけ?」という方もいるかもしれないね。追跡中のファイルというのは、何か変更をするとGitが検知するファイルのこと。裏を返せば「.gitignore(無視リスト)」に載せていないファイルのことだよ。
 
3.過去の時点のファイルの状態を検索できる

普通のgrepにない特徴として、git grep は過去のコミットを指定して検索ができます。

たとえば、今からあなたはひとつ前のコミットに戻って検索をしたいとします。普通のgrepで検索をすると、次の手順になります。

$ git checkout HEAD^ //1つ前のコミットに戻る
$ grep -R “検索したい文字列” //文字列を検索する
$ git checkout - //もといたブランチに戻る

このように3つのコマンドを実行しなければなりませんが、git grep を使うと、次のとおり、たった1つのコマンドで済んでしまいます。

$ git grep “検索したい文字列” HEAD^
 
f:id:itstaffing:20190617145538j:plain
コミットやブランチを直接指定して過去の状態を検索できるんだ!3つのコマンドが1つで済んじゃう。ラクでいいね!

git grep の使い方

・特定の文字列を含む箇所を検索したい(大文字、小文字を区別する)

一番基本的なコマンドです。検索したい文字列をダブルクォーテーションで囲みます。

$ git grep “検索したい文字列”

ためしに「http://」という古い形式の外部リンクが残っていないかを サンプルリポジトリ で検索してみますね。

f:id:itstaffing:20200518120758j:plain

このように検索結果が表示されました。左側にファイル名が、右側に該当箇所が表示されています。

f:id:itstaffing:20190617145538j:plain
一瞬で出てきた!でもこれだと、どこの行にあるかが分からないからちょっと不便だなぁ。
f:id:itstaffing:20190617145541j:plain
では、次のようにして行番号を表示させるよう設定するがよい。
$ git config --global grep.lineNumber true


f:id:itstaffing:20190617145541j:plain
こうすれば行番号も一緒に表示されるようになるぞ。

f:id:itstaffing:20200518120801j:plain

f:id:itstaffing:20190617145538j:plain
コロンで囲まれた数字が行番号だね!これは便利!

・コミットやブランチを指定して検索したい

検索したい文字列に続けて、コミット識別子(コミットIDやブランチ等)を入力すると、その時点のファイルの状態で検索できます。

$ git grep “検索したい文字列” コミット識別子

・特定ワードを含むファイル名のみ表示したい

-l オプションを使うと、ファイル名だけを出力できます。

$ git grep -l “検索したい文字列”

まとめ

リポジトリ内の検索ができる「git grep(グレップ)」について学びました。

・特定の文字列を含む箇所を検索する(大文字、小文字を区別する)

$ git grep “検索したい文字列”

・コミットやブランチを指定して検索する

$ git grep “検索したい文字列” コミット識別子

・ファイル名のみ表示する

$ git grep -l “検索したい文字列”

Gitにはまだまだたくさんのコマンドがあります。
次回は、犯人探し(!?)ができるコマンド「git blame」を学びましょう。


▼登場キャラクター紹介
f:id:itstaffing:20200122103525j:plain

▼わかばちゃんが登場する書籍

▼ これまでの「マンガでわかるGit」