Git Bisect для отладки
Используйте `git bisect`, чтобы эффективно найти конкретную фиксацию, добавившую ошибку, и сэкономить время на отладке.
«Git Bisect для отладки» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Как быстрее находить ошибки с помощью Git
Отладка может быть сложной. Иногда появляется ошибка, и вы не знаете, какое изменение её вызвало.
git bisect — мощная команда Git, которая помогает точно определить коммит, добавивший ошибку. Она использует алгоритм двоичного поиска, чтобы быстро сузить область поиска среди тысяч коммитов.
Сила двоичного поиска
Представьте, что в проекте 100 коммитов, а ошибка появилась где-то между первым и последним. Проверять каждый вручную — долго!
git bisect работает как игра «угадай число»:
- Вы указываете Git «хороший» коммит, в котором ошибки ещё не было.
- Вы указываете Git «плохой» коммит, в котором ошибка уже есть.
- Git выбирает коммит примерно посередине и просит проверить его.
- Вы помечаете его как «хороший» или «плохой», и Git вдвое сокращает область поиска.
Начнём поиск!
Для начала сообщите Git, что начинаете сеанс bisect. Эта команда инициализирует процесс:
git bisect start
После запуска укажите известный «плохой» коммит, в котором есть ошибка, и известный «хороший» коммит, в котором ошибки точно не было.
Часто «плохим» коммитом является текущий HEAD, а «хорошим» может быть более старый тег выпуска или коммит, созданный несколько дней назад.
Определение границ поиска
После запуска git bisect определите диапазон поиска:
- Плохой коммит: это коммит, в котором, как вам известно, есть ошибка. Используйте
git bisect bad <commit-hash>или простоgit bisect bad, если это текущийHEAD. - Хороший коммит: это коммит, в котором, как вам известно, ошибки НЕ было. Используйте
git bisect good <commit-hash>.
Затем Git автоматически переключится на коммит в середине этого диапазона.
Проверка и сужение поиска
После того как вы пометите хорошие и плохие коммиты, Git автоматически переключится на коммит в середине диапазона. Ваша задача — проверить код в этом коммите.
- Если ошибка IS присутствует, введите
git bisect bad. - Если ошибка IS NOT присутствует, введите
git bisect good.
Затем Git выберет другой коммит в середине оставшегося диапазона. Повторяйте эти действия, пока Git не найдёт первый «плохой» коммит.
Моделирование появления ошибки
Представим простую «ошибку» в скрипте. Смоделируем историю проекта, в которой появилась небольшая ошибка.
Вот исходный «хороший» скрипт:
main.sh
#!/bin/bash
echo "Hello from script!"
sum=0
for i in $(seq 1 3); do
sum=$((sum + i))
done
echo "Sum is: $sum"Пошаговое выполнение Bisect вручную
Теперь предположим, что в более позднем коммите цикл случайно изменили на seq 1 4, из-за чего сумма стала неверной: 10 вместо 6.
Начнём:
git bisect start
Затем пометим текущий HEAD, в котором есть ошибка, как плохой:
git bisect bad HEAD
А более старый, заведомо рабочий коммит — как хороший:
git bisect good <old_good_commit_hash>
Затем Git будет направлять вас, переключаясь на разные коммиты. Вы будете запускать ./main.sh, проверять, равна ли сумма 6 или 10, а затем вводить git bisect good или git bisect bad соответственно.
Автоматизация процесса отладки
Ручная проверка каждого коммита всё ещё может занимать много времени, если проверка сложная. git bisect run позволяет автоматизировать этот процесс!
Вы указываете скрипт, который завершает работу с кодом:
0(ноль), если коммит хороший.125, если коммит следует пропустить.- Любое другое ненулевое значение (например,
1), если коммит плохой.
Git будет выполнять этот скрипт для каждого проверяемого коммита, пока не найдёт ошибку.
#!/bin/bash
./main.sh | grep "Sum is: 6"
if [ $? -eq 0 ]; then
exit 0 # Good commit
else
exit 1 # Bad commit
fiЗавершение поиска
После того как git bisect успешно определит первый плохой коммит, Git сообщит его хеш и сообщение.
После обнаружения источника проблемы и понимания её причины важно вернуть репозиторий в исходное состояние, которое было до запуска bisect:
git bisect reset
Эта команда возвращает вас к коммиту, на котором вы находились при запуске bisect, и очищает временное состояние bisect.
Проверка знаний о Bisect
Вы только что выполнили git bisect start, пометили текущий HEAD как плохой, а более старый коммит — как хороший. Git переключился на коммит в середине диапазона.
Вы запускаете тесты и обнаруживаете, что ошибка IS PRESENT в этом среднем коммите.
`git bisect`: краткое повторение
Поздравляем! Вы научились использовать git bisect:
- Это мощный инструмент для поиска точного коммита, добавившего ошибку.
- Для эффективности он использует двоичный поиск.
- Вы определяете «хорошие» коммиты (без ошибки) и «плохие» коммиты (с ошибкой).
- Процесс проверки можно автоматизировать с помощью
git bisect run <script>. - Всегда выполняйте
git bisect reset, чтобы очистить состояние после поиска!
Часто задаваемые вопросы
Урок «Git Bisect для отладки» бесплатный?
Да — полный текст урока «Git Bisect для отладки» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Git Bisect для отладки»?
Используйте `git bisect`, чтобы эффективно найти конкретную фиксацию, добавившую ошибку, и сэкономить время на отладке. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Git Bisect для отладки»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Git Reflog и восстановление истории
- Git Bisect для отладки
- Обслуживание и очистка репозитория
- Перезапись истории с помощью git filter-repo