Git поиск строки в истории одного файла

173

Так что, если у меня есть файл с именем foo.rb, и он выдает ошибку для отсутствующего метода с именем bar , я хочу поискать в истории foo.rb строку, barчтобы узнать, была ли она когда-либо определена в прошлом.

Я нашел этот Поиск всей истории Git для строки?

Но это ищет все файлы. Я просто хочу искать в одном файле.

JD Исаакс
источник
6
Так же, как к вашему сведению, вы можете добавлять -- filenameк куче команд git, если хотите ограничить его одним файлом.
Карл Билефельдт

Ответы:

235

Для этого вы можете использовать опцию -S для git log:

git log -S'bar' -- foo.rb
ralphtheninja
источник
39
Или git log -G'bar' -- foo.rbискать diff, который содержит 'bar', а не коммиты, которые изменили количество вхождений 'bar' (см. Страницу руководства git-log).
Якуб Наребски
1
Это не сработало для меня с кавычками, я должен был использовать -Sbarего для поиска бара . Может быть, это как-то связано со мной с помощью командной строки Windows.
ЗБР
другими словами, -Gдля поиска по регулярным выражениям ... это тоже отличная ссылка: stackoverflow.com/a/4472267/2586761
ptim
17

Или, может быть, вы можете попробовать это (из связанных вопросов Поиск всей истории git для строки )

git rev-list --all foo.rb | (
    while read revision; do
        git grep -F 'bar' $revision foo.rb
    done
)

На самом деле он будет искать содержимое файла, а не фиксировать сообщения / патчи для любого появления бара.

Антуан Пелисс
источник
Для окон: for /F %i in ('git rev-list --all foo.rb') git grep -F bar %i foo.rb(следите за двойными кавычками, если в имени файла или поисковой фразе есть пробелы)
biscuit314
1
Для меня в Windows это не работало без «do»: for /F %i in ('git rev-list --all foo.rb') do git grep -F bar %i foo.rb (следите за двойными кавычками, если в имени файла или поисковой фразе есть пробелы)
xberger
2

Для команды git log есть переопределение (из руководства ):

$ git log Makefile      # commits that modify Makefile

Таким образом, вы можете использовать:

git log foo.rb | grep "bar"
Дмитрий Резник
источник
2
Спасибо, но это просто поиск в истории коммитов, а не в истории источника файла.
Джей Ди Айзекс
2
На самом деле есть еще одно переопределение, которое ищет изменение строковых данных: git log -S'foo () '# фиксирует, что добавляет или удаляет любые данные файла, соответствующие строке' foo () '
Дмитрий Резник
1
Вы также можете попробовать использовать параметр --full-diff. Журналы показывают не только историю коммитов, но и различия.
Дмитрий Резник
@DmitriyReznik - по-видимому --full-diff, не работает (как, в отличие от , не отображается diff) -p, по крайней мере, на git 1.7.9.5
sdaau
0

Я использовал, git log -S "string" --follow -p "path of file"который показывает полную историю всех изменений с этой строкой.

составлять вопросы
источник