Git история - найти потерянную линию по ключевому слову

У меня где-то в моем репозитории Git была строка, содержащая слово "Foo", несколько сотен транзакций раньше.

Если есть какой-либо способ найти номер его пересмотра, где он был в последний раз, не покупая FishEye?

Ответ 1

Это можно решить с помощью опции pickaxe (-S) gitlog

 git log -SFoo -- path_containing_change

(вы даже можете добавить временной диапазон: --since=2009.1.1 --until=2010.1.1)

-S<string>

Найдите различия, которые вводят или удаляют экземпляр <string>.
Обратите внимание, что это отличается от строки, просто появляющейся на выходе diff; более подробную информацию см. в записи кирки в gitdiffcore (7).

diffcore-pickaxe

Это преобразование используется для поиска файлов, представляющих изменения, которые касаются указанной строки.
Когда используется diffcore-pickaxe, он проверяет, есть ли файлы, чья "оригинальная" сторона имеет указанную строку и чья "результат" - нет.
Такой файл файл представляет "строку, появившуюся в этом наборе изменений".
Он также проверяет противоположный случай, который теряет указанную строку.


Обновление 2014:

С тех пор вы можете сделать (от nilbus ответ):

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

Этот список команд журналов фиксирует, что добавляет или удаляет заданную строку поиска/регулярное выражение (обычно) более позднее. Опция -p (--patch) вызывает отображение соответствующего diff, где шаблон был добавлен или удален, поэтому вы можете увидеть его в контексте.

Найдя соответствующий коммит, который добавляет текст, который вы искали (например, 8beeff00d), найдите ветки, содержащие commit:

git branch -a --contains 8beeff00d

(Я ссылаюсь на последнюю команду в Как перечислить ветки, содержащие заданную фиксацию?")

Ответ 2

В худшем случае используйте git bisect и grep?