52

I had somewhere in my Git repository a line containing the word "Foo" a couple of hundreds of commits before.

If there is any way to find its revision number where it was the last time?

BinaryButterfly
  • 18,137
  • 13
  • 50
  • 91

2 Answers2

100

That may be addressed by the pickaxe (-S) option of gitlog

 git log -SFoo -- path_containing_change

(you can even add a time range: --since=2009.1.1 --until=2010.1.1)

-S<string>

Look for differences that introduce or remove an instance of <string>.
Note that this is different than the string simply appearing in diff output; see the pickaxe entry in gitdiffcore(7) for more details.

diffcore-pickaxe

This transformation is used to find filepairs that represent changes that touch a specified string.
When diffcore-pickaxe is in use, it checks if there are filepairs whose "original" side has the specified string and whose "result" side does not.
Such a filepair represents "the string appeared in this changeset".
It also checks for the opposite case that loses the specified string.


Update 2014:

Since then, you can do (from nilbus's answer):

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'

These log commands list commits that add or remove the given search string/regex, (generally) more recent first.
The -p (--patch) option causes the relevant diff to be shown where the pattern was added or removed, so you can see it in context.

Having found a relevant commit that adds the text you were looking for (eg. 8beeff00d), find the branches that contain the commit:

git branch -a --contains 8beeff00d

(I reference that last command in "How to list branches that contain a given commit?")

Community
  • 1
  • 1
VonC
  • 1,262,500
  • 529
  • 4,410
  • 5,250
  • Note to self: the relation between `--pickaxe-all` and `-S` can be better understood with http://lists-archives.org/git/715566-git-log-why-are-full-diff-and-pickaxe-all-separate-options.html and http://article.gmane.org/gmane.comp.version-control.git/34909 – VonC May 15 '10 at 07:48
  • Quite a shoutout, thanks! Conversely, I always know if you've hit a question there's no need for me to answer. – Cascabel May 16 '10 at 23:38
  • @Jefromi: "I always know if you've hit a question there's no need for me to answer.". Well... about that. It never hurt to check ;) I am still learning here. For instance, http://stackoverflow.com/questions/2846843/find-the-git-branch-or-branches-from-commit-id/2846918#2846918 might benefit from your expertise. – VonC May 17 '10 at 17:25
  • Okay, there are exceptions to every rule; I do check, but very rarely am needed! – Cascabel May 17 '10 at 17:30
1

Worst case scenario, use git bisect and grep?

Amber
  • 507,862
  • 82
  • 626
  • 550