Gitコマンド入門::さまざまなツール(Git Grep2)第八十三回

3 min read読了の目安(約3400字

みなさんこんにちは! 今回も前回に続いて、git grep を学習して行きますね。検索する対象が、ワーキングディレクトリの他、個々のコミットに対しても可能ですからね。その辺りも少し試してみたいと思います。尚、環境は前回と同じものを使って行きますので、環境作成は、前回を参考にしてくださいね!

前回の記事はこちらから!

https://zenn.dev/shiozumi/articles/ce135827cebf1f

今日の学習も、引き続き、こちら!

https://git-scm.com/book/ja/v2/Git-のさまざまなツール-検索
7.5 Git のさまざまなツール - 検索

git本家本元の情報はこちらから!

https://git-scm.com/book/ja/v2

まずは、コミットを指定します!

$ git log  --stat --oneline

3071fcb (HEAD -> main, origin/main) 2nd
 test.php | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

3bee1de 1st
 sample.php | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)
  1. 1st で、sample.php を追加!
  2. 2nd で、test.php を追加!

git grep -c 'echo' 3071fcb で、2ndコミットを指定!

$ git grep -c 'echo' 3071fcb
3071fcb:sample.php:5
3071fcb:test.php:2

git grep -c 'echo' 3bee1de で、1stコミットを指定!

$ git grep -c 'echo' 3bee1de
3bee1de:sample.php:5

1st コミットの時点では、test.php ファイルがありませんから、sample.php のみの結果となりましたね。

ファイルをワーキングエリアから削除、3rdコミット

git rm test.php // <!-- 削除
git rm sample.php // <!-- 削除
git commit -m "3rd"

[main 3882998] 3rd
 2 files changed, 51 deletions(-)
 delete mode 100755 sample.php
 delete mode 100755 test.php
 
// --stat でファイルの追加、削除を確認! 
$ git log --stat --oneline

3882998 (HEAD -> main) 3rd
 sample.php | 35 -----------------------------------
 test.php   | 16 ----------------
 2 files changed, 51 deletions(-)

3071fcb (origin/main) 2nd
 test.php | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

3bee1de 1st
 sample.php | 35 +++++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

git grep -c 'echo' 3882998 で、3rdコミットを指定!

$ git grep -c 'echo' 3882998
$

勿論、当然ですけど、なにも表示されませんでした!

git restore --source=3071fc --worktree sample.php

$ git restore --source=3071fc --worktree sample.php
// 2nd コミットから、sample.php をリストアーします!

$ ls
sample.php
// 無事、ファイルを取り出して!

$ git grep -c 'echo'
$
// 何も検索でヒットしませんでした。(^▽^;)

あれれ?! ワーキングディレクトリに対しては、検索されませんね。

本家のマニュアルを見てみます!

https://git-scm.com/docs/git-grep

Google翻訳
作業ツリーの追跡ファイル、インデックスファイルに登録されているblob、または指定されたツリーオブジェクトのblobで指定されたパターンを探します。 パターンは、改行文字で区切られた1つ以上の検索式のリストです。 検索式としての空の文字列は、すべての行に一致します。

作業ツリーの追跡ファイルとなっていますね。

$ git status -s
?? sample.php
// この状態だと、追跡ファイルになっていませんね。

$ git add .
// add してからの!

$ git status -s
A  sample.php
// これで、追跡対象となりました!

$ git grep -c 'echo'
sample.php:5
// これで、検索対象となりました!

次は、test.phpもリストアー! 今度は、--staged オプションを付けて、add するひと手間を省略!

git restore --source=3071fc --worktree --staged test.php

$ git restore --source=3071fc --worktree --staged test.php

$ git status -s
A  sample.php
A  test.php
// どちらのファイルも、Aなので追跡対象となっています。

$ git grep -c 'echo'
sample.php:5
test.php:2

git reset --hard HEAD では、元に戻して!

$ git reset --hard HEAD
HEAD is now at 3882998 3rd
// では、一度、git reset --hard
// ワーキングディレクトリーをクリア!

$ git grep -c --cached 'echo'
$ ls
$ git status -s

// 無事、なにも検索にヒットしなくなりましたね!

まとめ

さあ、いかがでしょうか? ステージングエリアが対象ということ、ファイルを、addして追跡対象にしないと検索対象外ですね。まあ~ 通常のファイル対象ならば、Linuxコマンドの、grep で良いわけですし、、、当たり前の事でした。(^▽^;)

それでは、今回はここまで、お疲れ様でした!

https://zenn.dev/shiozumi/articles/d32b7e2f797206
https://twitter.com/esmile2013