git bisect: найти коммит, который сломал проект
Обновлено 31 июля 2026 г.
git bisect двоичным поиском находит первый коммит, после которого проект сломался: ты называешь рабочий и сломанный коммит, а git делит промежуток пополам до одного виновника.
Ситуация обычная. Неделю назад всё работало, сегодня не работает, между этими точками полсотни коммитов, и никто не помнит, какой из них что-то задел. Проверять по одному долго. Деление пополам укладывается в шесть проверок: каждый ответ выбрасывает половину оставшихся коммитов.
Поиск начинается с двух точек. Текущее состояние сломано, значит bad - это HEAD. Хеш рабочего коммита возьми из git log --oneline, отмотав историю на неделю назад.
$ git bisect start
status: waiting for both good and bad commits
$ git bisect bad
status: waiting for good commit(s), bad commit known
$ git bisect good 043bb10
Bisecting: 12 revisions left to test after this (roughly 4 steps)
[d93426ddd5d982dd2d13a8334ecbdb6ab024dbab] новая сетка страницыGit встал на середину промежутка и переписал рабочий каталог под этот коммит. Теперь твоя очередь. Сделай то, чем ты вообще заметил поломку: открой страницу или прогони тесты. Ответ git даётся одним словом.
$ git bisect good
Bisecting: 6 revisions left to test after this (roughly 3 steps)
[2ea20760160b06f0def0a625788535218d126ee8] переименовал классы сетки
$ git bisect bad
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[15a5be35a1027b2caae3b3c858b160f338be327d] убрал лишний div
$ git bisect good
Bisecting: 0 revisions left to test after this (roughly 1 step)
[387e18d65958f85d2578a95272fa05b91ca3272a] поправил отступ у менюЕщё один ответ, и промежуток схлопывается в один коммит:
$ git bisect good
2ea20760160b06f0def0a625788535218d126ee8 is the first bad commit
commit 2ea20760160b06f0def0a625788535218d126ee8
Author: Anna Petrova <anna@example.com>
Date: Wed Mar 19 10:00:00 2025 +0300
переименовал классы сетки
index.html | 2 ++
1 file changed, 2 insertions(+)Это ответ: двадцать шесть коммитов, четыре проверки. Дальше поиск надо закрыть, иначе так и останешься стоять посреди истории:
$ git bisect reset
Previous HEAD position was 387e18d поправил отступ у меню
Switched to branch 'main'Если проверка автоматизируется, git пройдёт весь путь сам. git bisect run <скрипт> запускает скрипт на каждом шаге и читает код возврата: ноль - коммит хороший, что угодно другое - плохой. Подходит любая команда с честным кодом возврата, от прогона тестов до grep по файлу.
Частые ошибки
Забыть git bisect reset. Всё время поиска ты находишься в состоянии detached HEAD, и git status про это честно пишет: You are currently bisecting, started from branch 'main'.. Коммит, сделанный в этом состоянии, ни к какой ветке не привязан. Закончил поиск - сразу reset, он вернёт на ту ветку, с которой ты начал.
Второе: перепутать good и bad. Git верит ответам на слово и построит поиск вокруг ошибки. Если сбился, git bisect log показывает всю цепочку ответов, а git bisect reset даёт начать заново.