🧙 Садовник: уточнил шаги, добавил проверки и обоснования. Примите, если полезно.
#1Самая обидная преграда: репозиторий клонировали с обрезанной историей, и старых коммитов просто нет.
Так бывает чаще, чем кажется: системы развёртывания клонируют с --depth 1 ради скорости.
git rev-parse --is-shallow-repositoryГлавный инструмент расследования — флаг -S, в документации он называется pickaxe, «кирка»:
Разница между ними важная. -S ищет коммиты, где строка появилась или исчезла. -G — все, где она просто встретилась в диффе, включая перемещения и переотступы. Для вопроса «когда это появилось» нужен -S.
git log -S'искомая строка' --format='%h %ad %an %s' --date=shortФлаг --follow продолжает историю через переименования и перемещения. Без него история обрывается в точке, где файл переехал в другую папку.
Работает только с одним путём — это ограничение самой команды.
git log --oneline --follow -- путь/к/файлуКогда коммит найден, нужно увидеть контекст целиком, а не только строку:
Обрати внимание на двоеточие против двойного тире: <sha>:путь — содержимое файла, <sha> -- путь — дифф.
git show --stat <sha>Флаги важны: -w игнорирует изменения пробелов, -C -C ищет, откуда строку скопировали. Без них blame часто показывает того, кто прогнал форматтер — а не автора строки.
git blame -w -C -C -L 40,55 путь/к/файлуКогда известно только «раньше работало, теперь нет»:
Если проверку можно автоматизировать, git сделает всё сам:
За 20 шагов просеивается миллион коммитов — это обычный двоичный поиск.
git bisect startУбедитесь, что используете последнюю версию Git, так как некоторые флаги могут изменяться или устаревать.
git --versionУбедитесь, что у вас есть доступ для выполнения всех необходимых команд в репозитории.