How to grep Git commits for a certain word?
git, git-log, grep, search
Solution
If you want to find all commits where the commit message contains a given word, use
$ git log --grep=word
If you want to find all commits where "word" was added or removed in the file contents (to be more exact: where the number of occurrences of "word" changed), i.e., search the commit contents, use a so-called 'pickaxe' search with
$ git log -Sword
In modern Git there is also
$ git log -Gword
to look for differences whose added or removed line matches "word" (also commit contents).
A few things to note:
- `-G` by default accepts a regex, while `-S` accepts a string, but it can be modified to accept regexes using the `--pickaxe-regex`.
- `-S` finds commits where the number of occurrences of "word" changed, while `-G` finds commits where "word" appears in the diff.
- This means that `-S<regex> --pickaxe-regex` and `-G<regex>` do not do exactly the same thing.
The `git diff` documentation has a nice explanation of the difference:
To illustrate the difference between `-S<regex> --pickaxe-regex` and `-G<regex>`, consider a commit with the following diff in the same file:
+ return frotz(nitfol, two->ptr, 1, 0);
...
- hit = frotz(nitfol, mf2.ptr, 1, 0);
While `git log -G"frotz\(nitfol"` will show this commit, `git log -S"frotz\(nitfol" --pickaxe-regex` will not (because the number of occurrences of that string did not change).
This will show the commits containing the search terms, but if you want to see the actual changes in those commits instead you can use `--patch`:
$ git log -G"searchTerm" --patch
This can then be piped to `grep` to isolate the output just to display commit diff lines with that search term. A common use-case is to display diff lines with that search term in commits since and including a given commit - `3b5ab0f2a1` in this example - like so:
$ git log 3b5ab0f2a1^.. -G"searchTerm" --patch | grep searchTerm
Problem
In a Git code repository I want to list all commits that contain a certain word. I tried this ``` git log -p | grep --context=4 "word" ``` but it does not necessarily give me back the filename (unless it's less that five lines away from the word I searched for. I also tried ``` git grep "word" ``` but it gives me only present files and not the history. How do I search the entire history, so I can follow changes on a particular word? I intend to search my codebase for occurrences of word to track down changes (search in files history).
Related problems
- File names only using Git grep
- How to grep (search through) committed code in the Git history
- Search all of Git history for a string
- Remove all text before colon
- Remove sensitive files and their commits from Git history
- How to search a Git repository by commit message?
- How to show the change itself using git log pickaxe?