Можно ли найти коммит в git по строчке?

Рейтинг: 4Ответов: 4Опубликовано: 25.09.2014

Есть репозиторий в гит с долгой, обширной и печальной историей.
В один файл в одном из коммитов добавляется строчка, которая ВСЕ ЛОМАЕТ.
Я хочу найти этот коммит и покарать негодяя. Могу ли я это сделать родными средствами git?
Если да, то как?

Строчка уникальна, похожих в файле точно нету.
В файле постоянно происходят массированные изменения, поэтому вдумчиво покурить в историю не помогло (разбираться, как автоматически парсить историю, влом).
Номер строчки, разумеется, может меняться.

Ответы

▲ 9Принят

Есть такая штука как bisect - она позволяет искать проблему методом деления пополам, который, как известно, имеет логарифмическую сложность. Суть: для начала указываете коммит, который точно сломан, потом коммит, который точно исправен. Гит делает checkout в коммит, который находится где-то посредине. В этот момент можно запустить тесты, посмотреть ручками и сказать git - этот коммит хорош или плох. И так до победного конца. И это будет быстро. Даже если там 1024 коммита, нужно будет сделать не более 10-11 просмотров кода.

Но если это просто одна строка, то можно прикрутить grep, который будет проверять наличие этой строки. Тогда процесс пойдет ещё быстрее.

git bisect start  # стартуем
git bisect bad    # текущий коммит - плохой
git bisect good <hash> # а вот коммит с таким хешем/тегом - хорош.

git bisect run grep 'string' * -rsq # поехали искать.

git распечатает информацию по первому коммиту, который содержит указанную строку.

И не забыть в конце поисков выполнить git bisect reset.

▲ 6

Если это строчка, и её никто потом не менял, то:

git blame
▲ 5

Есть опция -S для git-log, которая показвает все коммиты, добавляющие или удаляющие искомую строку:

git log -S 'if (x = 5) {'
▲ 1

Если файл и текст известны и нужно найти негодяя - просто делаете git blame и получите для каждой строки файла дату последнего коммита, хэш и автора.