Gymterview
junior

Что такое 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 для автоматизации с тестами. Частая ошибка кандидатов — не знать про этот инструмент вообще.