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

Есть ли в Git команда для поиска коммита, который вызвал ошибку?

2.0 Middle🔥 91 комментариев
#Другое

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

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

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

# Есть ли в Git команда для поиска коммита, который вызвал ошибку?

Ответ: ДА. Git имеет отличную встроенную команду git bisect — инструмент для двоичного поиска коммита, который вызвал регрессию (ошибку).

Git bisect - поиск "плохого" коммита

git bisect использует алгоритм двоичного поиска (binary search), чтобы найти первый коммит, где появилась ошибка. Это очень эффективно для больших историй коммитов.

Как это работает

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

Практический пример

# Начинаем поиск
git bisect start

# Указываем плохой коммит (текущая версия)
git bisect bad HEAD
# или
git bisect bad

# Указываем хороший коммит (известная рабочая версия)
git bisect good v1.0
# или через номер коммита
git bisect good abc1234

# Git переходит на коммит посередине
# Теперь ты тестируешь этот коммит

# Если это хороший коммит:
git bisect good

# Если это плохой коммит:
git bisect bad

# Git продолжает поиск...
# Повторяй, пока Git не сообщит, что найден первый плохой коммит

Пример с логирование процесса

$ git bisect start
$ git bisect bad
$ git bisect good v1.0
Bisecting: 10 revisions left to test after this (roughly 3 steps)
[abc1234] Some commit message

# Проверяешь, хороший ли это коммит
$ git bisect good
Bisecting: 5 revisions left to test after this (roughly 2 steps)

$ git bisect bad
Bisecting: 2 revisions left to test after this (roughly 1 step)

$ git bisect good
abc5678 is the first bad commit

Автоматизированный поиск с git bisect run

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

# Создаешь скрипт, который:
# - возвращает 0, если коммит хороший
# - возвращает 1, если коммит плохой

# script.sh
#!/bin/bash
npm test  # или make test, pytest и т.д.
if [ $? -eq 0 ]; then
    exit 0  # хороший коммит
else
    exit 1  # плохой коммит
fi

# Запускаешь bisect с автоматизацией
git bisect start
git bisect bad HEAD
git bisect good v1.0
git bisect run ./script.sh

# Git автоматически протестирует каждый коммит

Полный рабочий сценарий

# Ситуация: между версией 1.0 и HEAD появилась ошибка

# Инициализируем bisect
git bisect start

# Текущая версия плохая
git bisect bad

# Версия 1.0 была хороша
git bisect good v1.0

# Git: Bisecting: 100 revisions left to test after this (roughly 7 steps)
# Git переходит на коммит #50

# Проверяешь сборку, запускаешь тесты
npm run build
npm test

# Если тест прошёл - коммит хороший
git bisect good

# Если тест упал - коммит плохой
git bisect bad

# ... повторяешь несколько раз ...

# Когда найден первый плохой коммит:
# abc9999 is the first bad commit
# commit abc9999
# Author: John Doe <john@example.com>
# Date:   Mon Mar 1 10:00:00 2020
#     Introduced async bug

# Теперь ты можешь посмотреть этот коммит
git show abc9999

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

Завершить поиск

# Вернуться на исходную ветку
git bisect reset

Пометить коммиты вручную

# Пропустить коммит (например, если не можно его протестировать)
git bisect skip

# Переименовать для удобства
git bisect good
git bisect bad

Просмотр статуса

git bisect log  # показывает историю всех шагов

Git bisect vs другие методы

МетодСкоростьУдобствоАвтоматизация
git bisectОчень быстро (O(log n))Простой интерфейсПоддерживает
Ручной поискМедленно (O(n))УтомительноНет
Git log grepЗависитДля поиска по содержимомуДа

Другие Git команды для поиска

git blame

Показывает, кто и когда менял каждую строку:

git blame filename.java

git log --all --grep

Поиск коммитов по сообщению:

git log --all --grep="bug fix" --oneline

git log -S

Поиск коммитов, где менялся код:

git log -S "searchTerm" -- path/to/file

Лучшие практики

  1. Используй git bisect для регрессий - когда код был работающим, а потом сломался
  2. Записывай воспроизводимые тесты - это ускорит поиск с git bisect run
  3. Часто коммитил - чем чаще коммиты, тем быстрее поиск
  4. Используй хорошие сообщения коммитов - помогает найти причину

Заключение

git bisect — это мощный инструмент для поиска коммита, вызвавшего ошибку. За логарифмическое время (примерно 10-15 итераций для истории в 100k коммитов) ты найдёшь точный момент появления регрессии. Если есть автоматизированный тест, процесс можно полностью автоматизировать с git bisect run.