Practically any non-archaic machine has multiple cores now, so git-grep can easily be faster than regular grep from command line. By default grep is going through all of the . git directly, which is the part `git grep` filters out.
`git grep` command is used to search in the checkout branch and local files.
Git includes a grep command to search through commits to a repo as well as the local files in the repo directory: git grep. Sometimes it is useful to search for a string throughout an entire repo, e.g. to find where an error message is produced.
To search within a particular repository or organization, navigate to the repository or organization page, type what you're looking for into the search field at the top of the page, and press Enter.
The two are very similar. The main difference is that git grep
defaults to searching in the files that are tracked by git.
If I want to find foo
within my project I can use git grep
or good ol' stand-alone grep
:
git grep foo
grep -R foo .
The git grep
version will only search in files tracked by git, whereas the grep
version will search everything in the directory. So far so similar; either one could be better depending on what you want to achieve.
What if we want to limit the search to only .rb
files?
git grep foo -- *.rb
grep -R --include=*.rb foo .
The plain old grep
version is getting a bit more wordy, but if you're used to using grep
that may not be a problem. They're still not going to search exactly the same files, but again it depends on what you want to achieve.
What about searching in the previous version of the project?
git grep foo HEAD^
git checkout HEAD^; grep -R foo .; git checkout -
This is where git grep
makes a real difference: You can search in another revision of the project without checking it out first. This isn't a situation that comes up too often for me though; I usually want to search in the version of the project I have checked out.
There are some git config
variables that modify the behaviour of git grep
and avoid the need to pass a couple of command line arguments:
grep.lineNumber
: Always show line numbers of matches (you can pass -n
to both grep
and git grep
to get this behaviour)grep.extendedRegexp
: Always use extended regular expressions (you can pass -E
to both grep
and git grep
to get this behaviour)In practice I have gg
aliased to git grep -En
, and this almost always does what I want.
The main advantage of git grep
is that it can find the patterns in the git repository, i. e. also in others than the current version of the source. This cannot be done using the standard grep
of course. Also there are a lot more features in the git grep
like pattern arithmetic (things like git grep -e pattern1 --and --not \( -e pattern2 -e pattern3 \)
), tree search using glob (things like git grep pattern -- '*.[ch]'
to search only in .c
and .h
files) and some more.
Here's an example session for searching in an older revision:
$ mkdir git-test # create fresh repository
$ cd git-test/
$ git init .
Initialized empty Git repository in /home/alfe/git-test/.git/
$ echo eins zwei drei > bla # create example file
$ git add bla # add and commit it
$ git commit bla
[master (root-commit) 7494515] .
1 file changed, 1 insertion(+)
create mode 100644 bla
$ echo vier fuenf sechs > bla # perform a change on that file
$ git commit -m 'increase' bla # commit it
[master 062488e] increase
1 file changed, 1 insertion(+), 1 deletion(-)
$ git grep eins | cat # grep for outdated pattern in current version
# (finds nothing)
$ git grep eins master^ | cat # grep for outdated pattern on former version
# finds it:
master^:bla:eins zwei drei
git grep
only searches in the tracked files in the repo.
With grep
you have to pass the list of files to search through and you would have filter out any untracked files yourself.
So if you are searching for something that you know is in the repo, git grep
saves you time as all you have to do is provide the pattern. It also is useful for not having to search through anything that is untracked in the repo.
If you're searching for patterns/strings within a git repository (i.e. in files that are already tracked), then yes, git grep should be much faster typically than regular grep as it is indexed. (You can try this out manually, the git-grep should be perceptibly faster)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With