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>.

This -G option becomes handy when you’re looking for a pattern instead of a literal string.

Consider 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 -G to 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 thorough guide to practical Git techniques, check out thoughtbot’s Goal-Oriented Git book, written by developer George Brocklehurst.

For a convenient and productive way to run git commands in the terminal, give gitsh a try.