Git Bisect
Последнее обновление
git bisect находит коммит, внёсший баг, с помощью двоичного поиска. Вы указываете ему заведомо рабочий коммит и заведомо сломанный; он переключается на коммит посередине, вы помечаете его как good или bad, и он каждый раз вдвое сужает диапазон - так он находит виновника за несколько шагов даже среди тысяч коммитов.
Попробуйте это в терминальном playground - настоящая оболочка в вашем браузере, ничего устанавливать не нужно.
Синтаксис
| Command | What it does |
|---|---|
git bisect start | Начинает сессию bisect |
git bisect bad | Помечает текущий коммит как плохой |
git bisect good <hash> | Помечает заведомо рабочий коммит |
git bisect good / git bisect bad | Помечает каждый проверенный коммит |
git bisect run ./test.sh | Автоматизация: запускает тест, чтобы пометить каждый шаг |
git bisect reset | Завершает bisect, возвращает на вашу ветку |
Разбор примера
Найдите, какой коммит сломал сборку.
| Step | Command | Result |
|---|---|---|
| 1 | git bisect start | Запускает поиск |
| 2 | git bisect bad | Текущий коммит сломан |
| 3 | git bisect good v1.0 | Этот старый тег работал |
| 4 | Проверьте, затем good/bad | Повторяйте, пока Git не назовёт коммит |
Частые вопросы о git bisect
Что делает git bisect?
Он выполняет двоичный поиск по истории коммитов, чтобы найти точный коммит, внёсший баг. Вы помечаете один коммит как good, а другой как bad; Git многократно переключается на середину, чтобы вы её протестировали, каждый раз вдвое сужая диапазон поиска, пока не определит первый плохой коммит.
Как использовать git bisect?
Выполните
git bisect start, пометьте текущее сломанное состояние командой git bisect bad, а заведомо рабочий коммит - командой git bisect good <hash>. Git переключается на середину; протестируйте её и выполните git bisect good или git bisect bad. Повторяйте, пока Git не сообщит о первом плохом коммите, затем выполните git bisect reset.Можно ли автоматизировать git bisect?
Да.
git bisect run <script> запускает ваш скрипт на каждом шаге - скрипт должен завершаться с кодом 0 для хорошего коммита и с ненулевым для плохого (тест-раннеры отлично подходят). Тогда Git выполняет bisect автоматически, без ручной пометки каждого коммита, и в конце печатает виновный коммит.Как завершить bisect?
Выполните
git bisect reset, чтобы завершить сессию и вернуться на ветку и коммит, на которых вы были до начала. Делайте это независимо от того, нашли вы плохой коммит или нет - это очищает временное состояние bisect.Можно ли попрактиковаться в этом онлайн?
Да. Откройте терминальный playground, чтобы выполнить
git bisect в настоящей оболочке в вашем браузере - ничего устанавливать не нужно. Бесплатный интерактивный курс Git от Coddy также охватывает пошаговый разбор истории.