Что такое git bisect?
git bisect — это встроенный инструмент бинарного поиска коммита, который внёс баг. Git автоматически делит историю пополам и позволяет найти проблемный коммит за O(log N) шагов.
Аналогия из жизни: представьте, что в книге из 1000 страниц где-то допущена опечатка. Вместо просмотра каждой страницы, вы открываете середину: если опечатка уже есть — ищете в первой половине, иначе — во второй. Каждый шаг сокращает область поиска вдвое. 1000 страниц = максимум 10 проверок.
Как работает
Алгоритм бинарного поиска: если в истории N коммитов, потребуется не более log2(N) проверок. Для 1000 коммитов — максимум 10 шагов.
Ручной режим
Пример
# 1. Начать bisect
git bisect start
# 2. Указать «плохой» коммит (баг присутствует) — обычно текущий
git bisect bad
# 3. Указать «хороший» коммит (баг отсутствует)
git bisect good v1.0.0
# Git переключается на средний коммит и говорит, сколько шагов осталось:
# Bisecting: 12 revisions left to test after this (roughly 4 steps)
# 4. Проверяем: баг есть?
# Если да:
git bisect bad
# Если нет:
git bisect good
# 5. Повторяем шаг 4, пока Git не найдёт виновный коммит:
# a1b2c3d is the first bad commit
# 6. Завершить bisect и вернуться к исходному состоянию
git bisect reset
Автоматический режим
Можно автоматизировать, передав скрипт/команду, которая возвращает 0 (good) или 1 (bad):
Пример
# Автоматический bisect с тестом
git bisect start HEAD v1.0.0
git bisect run mvn test -pl payment-service -Dtest=PaymentCalculationTest
# Или с произвольным скриптом
git bisect run ./test-bug.sh
Пример скрипта test-bug.sh
#!/bin/bash
mvn compile -q && java -cp target/classes com.example.BugCheck
# Возвращает 0, если баг НЕ воспроизводится (good)
# Возвращает 1, если баг воспроизводится (bad)
Ключевые моменты
git bisect— невероятно эффективен для поиска регрессий: 1024 коммита = максимум 10 проверок- Автоматический
bisect runэкономит время — Git сам выполняет все проверки - Bisect работает с любой проверкой — компиляция, тест, ручная проверка
- Скрипт для
bisect runдолжен вернуть код 125, если коммит нельзя проверить (будет пропущен)
Частые ошибки
- Забывать
git bisect reset— оставаться в detached HEAD после завершения поиска - Не иметь автоматических тестов для проверки — приходится вручную тестировать каждый шаг
- Указывать неверный «хороший» коммит — если баг существовал и в нём, bisect не найдёт правильный результат
- Скрипт для
bisect runиспользует exit code неправильно (код 128 и выше прерывает bisect)
Как используется в 2026
git bisectостаётся стандартным инструментом для поиска регрессий- В сочетании с хорошим тестовым покрытием автоматический bisect находит проблемный коммит за секунды
- Некоторые CI-системы умеют запускать bisect автоматически при обнаружении регрессии
- AI-ассистенты помогают составлять скрипты для
bisect runпо описанию бага
На собеседовании: этот вопрос показывает глубину опыта. Объясните алгоритм (бинарный поиск, log2(N) шагов) и опишите пошаговый процесс: start, bad, good, повторять, reset. Бонус — упомянуть
bisect runдля автоматизации с тестами. Частая ошибка кандидатов — не знать про этот инструмент вообще.