Let’s say you want to delete a method
foo that seems to be dead code.
You use a tool like
grep to find callers of
foo, and there are no results.
It’s tempting to consider
foo to be unused at this point, but you
want to know the story of this method so you can be confident in removing it.
Why did this method ever exist?
From the git-log docs:
-S <string> Look for differences that change the number of occurrences of the specified string (i.e. addition/deletion) in a file.
Git will spit out all of the commits that either deleted or added the given
string (e.g. calls to a method). Unlike
git log --grep,
git log -S actually
searches the code in the repo, not the commit messages.
$ git log -S foo commit 8f19a1fa0... Author: Ian C. Anderson Date: Fri Mar 27 21:44:17 2015 -0500 stop using the foo method because eww commit 216895189... Author: Ian C. Anderson Date: Thu Mar 6 21:09:44 1999 -0500 new foo method - so great!
-G <regex> Look for differences whose patch text contains added/removed lines that match <regex>.
-G option becomes handy when you’re looking for a pattern instead of a
bar method that has 1 argument with a default value, but
none of the current calls to
bar use the default value. Let’s use
look for past usages of
bar that did use the default value (by looking
for the string
bar without a following parenthesis).
$ git log -G "bar[^(]" commit 8f19a1fa1... Author: Ian C. Anderson Date: Fri Mar 27 21:44:17 2015 -0500 remove custom args to bar method commit 216895180... Author: Ian C. Anderson Date: Thu Mar 6 21:09:44 1999 -0500 new bar method
We now see all of the commits that added or removed a line matching our pattern.
These two commands have become indispensable tools for me, especially when navigating and refactoring large and/or legacy codebases.
For a convenient and productive way to run git commands in the terminal, give gitsh a try.