1. ホーム
  2. 記事一覧
  3. リポジトリ内の探しものは「git grep」で効率的な検索テクニックを紹介

2024.06.02

リポジトリ内の探しものは「git grep」で効率的な検索テクニックを紹介

はじめに

アプリ開発において「Git」は必須スキルになっています。Gitには様々なコマンドが存在し、それらを適切に使用することで、開発作業の安全性を高め、効率化を実現できます。

Gitを使い始めてまだ間もないころ、開発中にクラス名のスペルミスに気付きました。スペルミス部分を修正しようと、1つ1つファイルを開いて該当のキーワードを検索して修正して…という、とても手間のかかる方法で修正していました。このような時は「git grep」コマンドを使用すると、リポジトリ内のファイルを一度に検索することができて、とても便利なのです。そんなリポジトリ内を一斉検索できる便利なコマンド、「git grep」をこの記事で解説します。

様々なGitコマンドを習得し、Gitマスターを目指しましょう!

「git grep」について

git grepは、Git で管理されているワークツリー上のファイルを検索するコマンドです。これを使うことで、ワークツリーや作業ディレクトリ内のファイルを素早く検索できます。この検索はキーワード検索に加え、正規表現にも対応しており、リポジトリ全体をはじめ、特定のブランチやコミットなど、様々な場所を指定して検索することが可能です。冒頭でお話ししたクラス名を検索する場面ではgit grepを使うことで、そのクラス名が記述されているファイル名やコードの行番号を検索結果として取得できます。さらに、検索キーワードが使用されている場所の数を調べることができて、非常に便利です。

このように、git grepは効率的なコード検索をサポートし、開発作業をスムーズに進めるための強力なツールです。

「git grep」 と「grep」の違い

検索コマンドであればgrepでも良いのでは?と考える方もいるかと思いますが、git grepgrepには以下のような違いがあります。

  • 検索スピード:git grepはリポジトリ内のみを対象として検索するため、grepコマンドよりも速く検索することができます。
  • 過去のコミットの検索:git grepは過去のコミットも対象に検索できるのに対し、grepではコミット内のデータを検索することはできません。
  • 検索対象のファイル:git grepはGitで追跡中のファイルのみを対象に検索します。一方、grepコマンドではキャッシュなど、検索の必要がないファイルも含まれてしまうことがあります。

grepについては以下のページで詳しく解説しています。

Linuxコマンド[grepと正規表現] | エンベーダー

「git grep」コマンドの開発現場での活用例

git grepは、柔軟な検索ができるため、開発現場の様々な場面で活用されています。大規模な開発では、コードの記述量やファイル数が膨大になることがあります。そんな中で、必要な情報を素早く検索できることは非常に重宝されます。このセクションから、開発現場での活用例をはじめ、基本的な検索方法から正規表現やオプションを活用した検索方法までを紹介します。これらを活用することで、ユーザーは欲しい情報を効率よく収集することができます。

特定のコードパターンの検索

開発者が特定の関数名やクラス名などをリポジトリ全体で検索したい場合に、git grepが役立ちます。またバグ修正などを行う際、修正箇所が他の部分に影響を与えないかを確認する際にも使用されます。特定のコードパターンが、他のファイルやモジュールで使われているかを調べることができます。

過去の変更履歴の追跡

過去のコミットを対象に検索することで、特定の変更が行われた履歴を確認することができます。これにより、いつ、誰が、どのような変更を加えたのかを調査できます。

マルチブランチでの検索

複数のブランチにわたって特定のパターンを検索することもできます。例えば、開発ブランチとリリースブランチの両方で特定の設定値が使われているかを確認するなどの際に使用されます。

これらの例のように、git grepはリポジトリ内をさまざまな方法で迅速に検索し、開発の効率を大幅に向上させるツールとして、日常的に活用されています。

「git grep」の使い方

チーム開発を進める中で、ある関数名について「何をする関数なのか、もっとわかりやすい名前にして欲しい」という要望が上がりました。その関数は多くのファイルで使用されており、使われているすべての箇所を探し出して修正する必要があります。このような場面でgit grepは効果を発揮します。

キーワード検索

基本的なキーワード検索に加えて、ファイルの拡張子や検索対象を指定して検索することが可能です。これにより、ユーザーは柔軟な検索方法を用いて、必要な情報を効率的に収集できます。

  • 特定のキーワードが使用されている箇所を検索

    リポジトリ全体を対象として、指定したキーワードで検索を行います。

    git grep "検索キーワード"
  • 特定の拡張子のファイルのみを対象としてキーワード検索

    検索キーワードと検索対象ファイルの拡張子を指定して検索します。特定の種類のファイルのみを対象にした検索結果が必要な場合などに使用されます。

    git grep "検索キーワード" -- "*.拡張子"
  • 特定のディレクトリのファイルのみを対象としてキーワード検索

    検索キーワードと検索対象のディレクトリを指定して検索します。特定のディレクトリ内のみを検索したい場合に使用されます。

    git grep "検索キーワード" -- ディレクトリ名
  • 特定のコミットやブランチを検索

    検索キーワードと検索対象のコミットやブランチを指定して検索します。特定のコミットやブランチ指定することで、その時点のファイル構造やコード内の特定キーワードの出現箇所を調べることが可能になります。

    git grep "検索キーワード" "検索したいコミットハッシュ値"
    git grep "検索キーワード" "検索したいブランチ名"

正規表現での検索

git grepを正規表現と組み合わせて使用すると、コードベース全体から高度なパターン検索を行うことができます。これにより、特定のコードパターンやバグの特定、リファクタリングの際の影響範囲の確認など、さまざまな用途に対応できます。

  • 行の先頭が指定したキーワードで始まる行を検索

    検索キーワードの前に^を追加します。行の先頭と検索キーワードが一致する行を検索します。

    git grep "^検索キーワード"
  • 行の末尾が指定したキーワードで終わる行を検索

    検索キーワードの後に$を追加します。行の末尾と検索キーワードが一致する行を検索します。

    git grep "検索キーワード$"
  • 特定のパターンに合う行を検索

    検索キーワードの後に数字が続くパターンに一致する行を検索します。

    git grep "検索キーワード[0-9]"

正規表現(拡張)での検索

正規表現(拡張)は、より複雑なパターンや様々な検索条件を記述できるため、基本的な正規表現よりも強力で柔軟な検索条件を指定することができます。正規表現(拡張)を使用しての検索には、-Eオプションを追加します。

  • | (パイプ): 複数の選択肢を検索

    「検索キーワード1」または「検索キーワード2」に一致する行を検索します。

    git grep -E "検索キーワード1 | 検索キーワード2"
  • ()(括弧): 部分パターンをグループ化し、繰り返しや論理和に使用し検索

    例えば、(foo|bar)bazというパターンを検索したい場合は以下のコマンドになります。

    git grep -E "(foo|bar)baz"

    sample.text内のfoobazまたはbarbazにマッチする行が検索一致として表示されます。

    sample.text
    foobaz
    hogebaz
    barbaz
    Alicebaz
    Bobbaz
    
    git grep -E "(foo|bar)baz"
    src/components/sample.txt:foobaz
    src/components/sample.txt:barbaz
  • +(プラス): 直前の文字やグループが1回以上繰り返されるパターンに一致した検索

    このコマンドは、a が1回以上繰り返され、その後に b が続く行を検索します。

    sample.text
    ab
    ba
    aabb
    bbaa
    aaabbbb
    bbbbaaa
    
    git grep -E "a+b"
    src/components/sample.txt:ab
    src/components/sample.txt:aab
    src/components/sample.txt:aaabbbb
  • ?(クエスチョンマーク): 直前の文字やグループが0回または1回繰り返されるパターンに一致する検索

    例えば、color または colour のどちらかの単語を含む行を検索する場合、? を使用して次のように検索できます。

    git grep -E 'colou?r'

    以下の様なテキストを検索した場合の実行結果です。colorまたはcolourを含む部分が検索一致として表示されます。

    sample.text
    color
    colour
    colorful
    
    git grep -E 'colou?r'
    src/components/sample.txt:color
    src/components/sample.txt:colour
    src/components/sample.txt:colorful

「git grep」のオプション紹介

項目説明
-n検索キーワードが位置する行番号を表示
-c検索キーワードが使用されている箇所の個数を表示
-w検索キーワードが「単語全体」として一致する行を検索
-l検索キーワードが含まれるファイル名のみを検索
-i指定したワードの大文字小文字を無視して検索

-n

指定した検索キーワードが位置する行番号を表示します。検索キーワードが使用されているファイル名と共に、使用箇所の行番号を合わせて結果を表示します。より詳細な使用箇所を特定することができます。

git grep -n "検索キーワード"

-nオプションを使用して検索した結果です。以下の結果のsrc/App.jsx:に続く数値が行番号です。行番号を表示することで、より詳細な使用箇所を調べることができます。

git grep -n "handleChange"
src/App.jsx:12:    function handleChange(e) {
src/App.jsx:21:    <input value={text} onChange={handleChange} />

-c

検索キーワードが使用されている箇所の個数を表示します。このオプションは、検索ワードの使用頻度をファイルごとに把握したい場合に使用され、コードの分析やリファクタリングの計画を立てる際に役立ちます。

git grep -c "検索キーワード"

-cオプションを使用して検索した結果です。src/App.jsx:に続く数値が、検索キーワードが使用されている箇所数です。以下の実行結果では、src/App.jsx:ファイルにtextが3箇所使用されているということが分かります。このように、使用されているファイル名と検索キーワードは何個あるかを簡単に調べることができます。

git grep -c "text"
src/App.jsx:3

-w

検索キーワードが「単語全体」として一致する行を検索するために使用されます。これは、検索キーワードが他の単語の一部ではなく、独立した単語として存在する場合にのみ一致し、検索結果として出力されます。検索キーワードの部分一致を除外した、より正確な検索結果を得ることができます。

git grep -w "検索キーワード"

使用例:textという単語を検索します。

git grep -w "text"

この場合、textが一つの単語として独立している以下の様な行が一致します。

const text = "Hello, World!";
console.log(text);

次のような行は、textが「createContext」の中に含まれており、単語として独立していないため、一致対象外となります。検索キーワードが単語の一部に含まれている部分を除外したい場合など、検索対象を絞りたい際に使用されます。

const MyContext = createContext();

-l

検索キーワードが含まれているファイル名だけを一覧表示します。このオプションを使うことで、特定のキーワードを含むファイルのリストを素早く取得できます。これにより、大量のファイルから検索キーワードを含むファイルを特定しやすくなり、効率的なファイル管理や解析が可能になります。

git grep -l "検索キ-ワード"

-lオプションの実行結果です。

検索キーワードtextが含まれているファイル名のみを表示します。検索キーワードを含むファイル名だけが一覧表示されています。リファクタリング作業前など、提案されている修正がどのファイルに影響を及ぼすかを調査する際に便利です。

git grep -l "text" -- src/
src/App.jsx
src/Test.jsx

-i

検索時に大文字と小文字を区別せずに検索するためのオプションです。これにより、キーワードが異なる大小文字の組み合わせで表現されている場合でも、すべての一致を見つけることが可能になります。

git grep -i "検索キーワード"

-iオプションの実行結果です。text, Textの両方が一致した行として表示されています。

src/App.jsx:    const [ text, setText] = useState("Hello")
src/App.jsx:    setText(e.target.value);
src/App.jsx:    <input value={text} onChange={handleChange} />     
src/App.jsx:    <p>You typed: {text}</p>
src/App.jsx:    <Button onClick={() => setText("Hello")}>

この記事で学んだこと

この記事を通じて、「git grep」に関連する様々な知識を得ることができました。簡単に振り返ってみましょう。

「git grep」とは

git grepは、Git で管理されているワークツリー上のファイルを検索するコマンドです。この検索はキーワード検索に加え、正規表現にも対応しており、リポジトリ全体をはじめ、特定のブランチやコミットなど、様々な場所を指定して検索することが可能です。大規模な開発において、必要な情報を素早く見つけ出すことができます。

さまざまな検索方法

git grepでは、多彩な検索方法が用意されています。正規表現やオプションを組み合わせて柔軟な検索を行うことが可能で、ファイルの特定の部分や使用されている情報の量など、様々な条件で検索を行うことができます。検索方法を工夫することで、効率的に情報を収集できます。

この記事では「git grep」の基本や実際の利用法に至るまで、その活用法を詳しく解説してきました。

ぜひこのコマンドを日々の学習に取り込み、実践を積んで理解を深めていきましょう。

【番外編】USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

IT未経験者必見 USBも知らなかった私が独学でプログラミングを勉強してGAFAに入社するまでの話

プログラミング塾に半年通えば、一人前になれると思っているあなた。それ、勘違いですよ。「なぜ間違いなの?」「正しい勉強法とは何なの?」ITを学び始める全ての人に知って欲しい。そう思って書きました。是非読んでみてください。

「フリーランスエンジニア」

近年やっと世間に浸透した言葉だ。ひと昔まえ、終身雇用は当たり前で、大企業に就職することは一種のステータスだった。しかし、そんな時代も終わり「優秀な人材は転職する」ことが当たり前の時代となる。フリーランスエンジニアに高価値が付く現在、ネットを見ると「未経験でも年収400万以上」などと書いてある。これに釣られて、多くの人がフリーランスになろうとITの世界に入ってきている。私もその中の1人だ。数年前、USBも知らない状態からITの世界に没入し、そこから約2年間、毎日勉学を行なった。他人の何十倍も努力した。そして、企業研修やIT塾で数多くの受講生の指導経験も得た。そこで私は、伸びるエンジニアとそうでないエンジニアをたくさん見てきた。そして、稼げるエンジニア、稼げないエンジニアを見てきた。

「成功する人とそうでない人の違いは何か?」

私が出した答えは、「量産型エンジニアか否か」である。今のエンジニア市場には、量産型エンジニアが溢れている!!ここでの量産型エンジニアの定義は以下の通りである。

比較的簡単に学習可能なWebフレームワーク(WordPress, Rails)やPython等の知識はあるが、ITの基本概念を理解していないため、単調な作業しかこなすことができないエンジニアのこと。

多くの人がフリーランスエンジニアを目指す時代に中途半端な知識や技術力でこの世界に飛び込むと返って過酷な労働条件で働くことになる。そこで、エンジニアを目指すあなたがどう学習していくべきかを私の経験を交えて書こうと思った。続きはこちらから、、、、

note記事3000いいね超えの殿堂記事 今すぐ読む

エンベーダー編集部

エンベーダーは、ITスクールRareTECHのインフラ学習教材として誕生しました。 「遊びながらインフラエンジニアへ」をコンセプトに、インフラへの学習ハードルを下げるツールとして運営されています。

RareTECH 無料体験授業開催中! オンラインにて実施中! Top10%のエンジニアになる秘訣を伝授します! RareTECH講師への質疑応答可

関連記事