← Назад к вопросам

Зачем нужна команда git bisect?

2.0 Middle🔥 191 комментариев
#Инструменты и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Зачем нужна команда git bisect?

git bisect — это команда для поиска коммита, который внёс баг в проект. Она использует бинарный поиск, чтобы найти проблему среди сотен или тысяч коммитов за несколько шагов вместо того, чтобы проверять каждый вручную.

Проблема

Представь ситуацию:

  • Неделю назад сайт работал
  • Сегодня обнаружили баг
  • За неделю было 200 коммитов
  • Который из них сломал функцию?

Проверять все 200 вручную долго и скучно. Здесь помогает git bisect.

Как работает

git bisect использует алгоритм бинарного поиска:

  1. Ты указываешь последний хороший коммит (когда всё ещё работало)
  2. Ты указываешь плохой коммит (текущий, с багом)
  3. Git берёт коммит ровно посередине между ними
  4. Ты проверяешь: работает или нет?
  5. Основываясь на ответе, git выбирает нужную половину
  6. Повтор, пока не останется один коммит

Пример

Предположим, 200 коммитов между хорошим и плохим:

Этап 1: проверяет коммит 100 (средина)
Этап 2: проверяет коммит 150 (если баг там) или 75 (если там нормально)
Этап 3: проверяет коммит 175 или 125
Этап 4: проверяет коммит 187 или 137
...

Вместо 200 проверок нужно всего 8 итераций!

Практическое использование

# Начинаем бинарный поиск
git bisect start

# Указываем текущий коммит как плохой
git bisect bad

# Указываем последний известный хороший коммит
git bisect good abc1234

# Git переключится на коммит посередине
# Ты проверяешь: работает ли функция?

# Если баг есть - помечаешь как bad
git bisect bad

# Если работает - помечаешь как good
git bisect good

# Повтор, пока git не найдёт точный коммит

# Когда найден, выходим
git bisect reset

Пример с реальным багом

# Открыли кнопку - не работает
git bisect start
git bisect bad              # Текущее состояние (с багом)
git bisect good v1.2.0      # Последняя версия, где работала

# Git переключается, например, на коммит zzz789
# Проверяем кнопку... не работает
git bisect bad

# Переключается на коммит yyy456
# Проверяем кнопку... работает!
git bisect good

# Переключается на коммит xxx123
# Проверяем кнопку... не работает
git bisect bad

# И так далее...
# Через 5-6 итераций git скажет:
# "Первый плохой коммит: abc123 - Refactor button component"

git bisect reset
fehash git show abc123    # Смотрим, что именно сломалось

Автоматизация

Можно передать скрипт, который автоматически проверяет баг:

git bisect run npm test -- --testNamePattern="buttonWorks"

# git bisect будет запускать тест на каждом коммите
# Если выход кода 0 - коммит хороший
# Если выход !=0 - коммит плохой

Другие подкоманды

git bisect reset    # Вернуться на исходный коммит
git bisect log      # История бинарного поиска
git bisect replay   # Повторить предыдущий поиск

Когда использовать

  • Баг появился недавно, но неизвестно в каком коммите
  • Нужно найти регрессию в функционале
  • Нужно откатить ровно один проблемный коммит
  • Нужно понять, когда начала глючить фича

Преимущества

Скорость: логарифмическая сложность вместо линейной. Для 1000 коммитов нужно 10 проверок вместо 500.

Точность: найдёшь ровно тот коммит, который сломал функцию.

Простота: не нужны умные сценарии — просто отмечаешь good/bad.

git bisect — незаменимый инструмент для охотников на баги!