Бывает такая ситуация: функциональность работала неделю назад, а сейчас — нет. За это время в репозитории накопилось сорок коммитов от разных людей. Просматривать каждый по очереди — долго и мучительно.

git bisect решает эту задачу умно: он делает бинарный поиск по истории коммитов. Вы говорите «вот этот коммит рабочий, а вот этот — нет», а Git сам переключает репозиторий на середину диапазона и спрашивает: «Здесь работает?» После нескольких ответов плохой коммит найден.

Работает бинарный поиск: сорок коммитов — шесть вопросов, восемьсот коммитов — десять вопросов.

Как пользоваться

Начинаем сессию:

git bisect start

Помечаем текущее состояние как плохое:

git bisect bad

Помечаем последний известный рабочий коммит как хороший. Можно указать хеш или тег:

git bisect good v1.2.0

Git переключит репозиторий на коммит посередине диапазона. Проверяем — работает или нет — и сообщаем:

git bisect good  # если всё работает
git bisect bad   # если не работает

Повторяем до тех пор, пока Git не скажет:

a3f8c12 is the first bad commit

Завершаем сессию и возвращаемся к исходному состоянию:

git bisect reset

Попробуйте сами — симуляция поиска

Серые коммиты — непроверенные, зелёные — рабочие, красные — сломанные. Кружок с синей рамкой — текущая проверяемая точка.

Автоматический bisect

Если есть скрипт, который проверяет работоспособность и возвращает 0 при успехе и ненулевой код при ошибке, можно автоматизировать весь процесс:

git bisect start
git bisect bad HEAD
git bisect good v1.2.0
git bisect run npm test

Git будет сам переключаться по коммитам и запускать тесты, пока не найдёт виновника.

Что запомнить

git bisect — бинарный поиск по истории коммитов. Вместо того чтобы проверять коммиты один за другим, он делит диапазон пополам на каждом шаге. Сорок коммитов — шесть проверок. Не забудьте сделать git bisect reset в конце, чтобы вернуться в исходное состояние.


«Доктайп» — журнал о фронтенде. Читайте, слушайте и учитесь с нами.

ТелеграмПодкастБесплатные учебники