Что такое git bisect и как он помогает найти проблемный коммит?
Что проверяют
Умеете ли вы искать регрессию системно, а не перебором коммитов наугад. Для iOS-разработчика вопрос особенно практичный: сборка и прогон тестов долгие, поэтому ценится умение автоматизировать поиск. Следом спрашивают, сколько шагов уйдёт на тысячу коммитов и как обойтись без ручной проверки.
Как отвечать
git bisect делает бинарный поиск по истории между заведомо хорошим и заведомо плохим коммитом. На N коммитов нужно около log₂N проверок: на 1000 коммитов примерно 10.
- старт:
git bisect start, затемgit bisect badдля текущего состояния иgit bisect good v3.4.0для релиза, где всё работало. Короче:git bisect start HEAD v3.4.0; - шаг: Git переключает рабочую копию на середину диапазона, вы собираете, проверяете и отвечаете
git bisect goodилиgit bisect bad; - пропуск:
git bisect skip, если коммит не собирается и проверить его нельзя; - автоматизация:
git bisect run ./check.sh. Код выхода 0 означает хороший коммит, 125 пропуск, остальные от 1 до 127 плохой. Внутри скриптаxcodebuild testс-only-testing:на один тест, который воспроизводит баг; - завершение:
git bisect resetвозвращает на ветку, с которой начинали, аgit bisect logсохраняет ход поиска.
Специфика iOS: между коммитами меняются зависимости, поэтому скрипт должен разрешать пакеты SPM или делать pod install. Для чистого результата удобно указать отдельный -derivedDataPath, чтобы старый кэш не подмешивал артефакты. Если в истории много merge-коммитов, помогает git bisect start --first-parent: поиск пойдёт только по коммитам основной ветки.
Где спотыкаются
Помечают коммит, не проверив его честно: запустили приложение из закэшированной сборки или на симуляторе остались данные от прошлого прогона. Одна ошибочная пометка уводит поиск в неверную половину, и найденный коммит окажется ни при чём.
Не знают про run и skip и десять раз вручную ждут пятиминутную сборку.
Забывают git bisect reset, продолжают работать в detached HEAD и потом теряют сделанные там коммиты. И ещё: bisect полезен настолько, насколько мелкие коммиты. Если он указал на сквош на три тысячи строк, дальше искать придётся руками.