I’ve been using git grep for a while, and I have to thank my friend and ex-colleague at BIZZBY Fabrizio Moscon for introducing me to it.

What git grep does is printing lines matching a pattern, it looks through the files tracked in the repo’s HEAD for lines matching a given pattern, and prints them.

If we look at it’s man page we see that the command has a huge number of options, here’s some that I find useful.

The simplest way to use it is git grep foo, which will print all the lines in all the tracked files where foo appears.

Sometimes the results list can be very dense, to improve readability we can use the --break option, that will print an empty line between the matches form different files, git grep --break foo.

Or maybe we’d like to look inside the matching files. We can make git grep open the matching files in a “pager”, like less or vim, to explore it’s content using git grep -O foo.

We can restring the search scope to a path appending it, like this: git grep foo -- a/path/.

But git grep is even more powerful, it supports Boolean expression to combine patterns, so we can do cool things like git grep -e foo --and -e bar or git grep -e foo --and --not -e baz. Noticed the -e? It means that the next parameter is a pattern, and it’s required when using these operators.

-e is also useful when the pattern you want to use starts with a dash -, so that git grep doesn’t read it as an argument.

And all this is just the tip of the iceberg! Have a look at git grep --help or man git-grep to find out more.

Food for thought

  • Look into other useful options.
  • What are the most surprising combo that can be made git git grep?
  • Real example of usages of the command that helped solved problems during development.