Как быстро выявлять ошибки с помощью Git Bisect
В огромном мире разработки программного обеспечения отладка часто может быть сложной задачей, особенно при работе с большими и старыми кодовыми базами. Представьте, что вы столкнулись с ошибкой или неожиданным изменением в поведении, и вам нужно отследить его до коммита, вызвавшего проблему. И тут на помощь приходит git bisect
. git bisect
— это мощный и эффективный инструмент, предоставляемый Git, который выполняет бинарный поиск в истории коммитов, позволяя вам точно определить коммит, ответственный за изменение.
Бинарный поиск: фундаментальная концепция
Прежде чем мы углубимся в детали Git Bisect, давайте кратко рассмотрим концепцию бинарного поиска. Двоичный поиск — это алгоритм, используемый для поиска целевого значения в отсортированном списке значений. Он работает путем многократного деления пространства поиска пополам, пока не будет найдено целевое значение. Этот подход очень эффективен, особенно для больших и отсортированных наборов данных. Git Bisect использует этот алгоритм бинарного поиска для эффективной навигации по истории коммитов и выявления проблемных коммитов.
Начало работы с Git Bisect
Теперь, когда мы познакомились с основами бинарного поиска, давайте рассмотрим, как использовать Git Bisect для определения фиксации, которая привела к ошибке или вызвала изменение в поведении.
Инициализация сеанса Bisect
Чтобы запустить сеанс Git Bisect, используйте следующую команду:
$ git bisect start
Эта команда инициализирует сеанс bisect и подготавливает Git к процессу двоичного поиска.
Маркировка хороших и плохих коммитов
Затем нам нужно пометить «хороший» коммит и «плохой» коммит, чтобы определить диапазон, в котором, как мы подозреваем, была введена ошибка. «Хороший» коммит — это коммит, в котором присутствует желаемое поведение, а «плохой» коммит — это коммит, в котором присутствует нежелательное поведение.
Чтобы отметить «хороший» коммит, используйте следующую команду:
$ git bisect good <commit>
Замените <commit>
хэшем фиксации или любой ссылкой, которая идентифицирует «хорошую» фиксацию.
Чтобы отметить «плохой» коммит, используйте следующую команду:
$ git bisect bad <commit>
Снова замените <commit>
хэшем фиксации или любой ссылкой, которая идентифицирует «плохую» фиксацию.
Выполнение бинарного поиска
После того, как вы отметили «хорошие» и «плохие» коммиты, Git Bisect выполнит бинарный поиск, автоматически проверяя коммит в середине диапазона. Вам будет предложено протестировать эту фиксацию и определить, демонстрирует ли она поведение, которое вы пытаетесь найти.
Чтобы протестировать фиксацию, запустите приложение, выполните соответствующие тестовые случаи или выполните любые необходимые действия для наблюдения за поведением. В зависимости от результата у вас есть два варианта:
Если фиксация демонстрирует желаемое поведение, используйте следующую команду:
$ git bisect good # Mark the current midpoint as good, discard earlier commits
Если фиксация демонстрирует нежелательное поведение, используйте следующую команду:
$ git bisect bad # Mark the current midpoint as bad, discard later commits
Основываясь на ваших отзывах, Git Bisect сузит диапазон коммитов для тестирования и проверит следующий коммит в пространстве поиска. Процесс продолжается итеративно до тех пор, пока Git не идентифицирует конкретную фиксацию, которая привела к ошибке или вызвала изменение в поведении.
Завершение сессии Bisect
Как только Git Bisect определит проблемный коммит, он предоставит вам информацию об этом коммите, такую как хэш коммита, автора и сообщение коммита. На этом сеанс bisect завершен, и вы можете выйти из сеанса.
Чтобы выйти из сеанса bisect и вернуться в нормальное состояние, используйте следующую команду:
$ git bisect reset
Эта команда очищает состояние bisect и возвращает ваш репозиторий к фиксации, которая была проверена до начала сеанса bisect.
Пропуск нерелевантных коммитов
В некоторых случаях вы можете столкнуться с коммитами, не относящимися к изучаемой вами ошибке или изменению поведения. Например, коммит может вносить несвязанные изменения или быть известным как непроверяемый. В таких ситуациях вы можете пропустить эти коммиты, чтобы сосредоточиться на более важных.
Чтобы пропустить фиксацию вручную во время сеанса bisect, используйте следующую команду:
$ git bisect skip
Эта команда указывает Git Bisect пропустить текущий коммит и перейти к следующему. Вы можете использовать эту команду несколько раз, чтобы пропустить несколько коммитов.
В качестве альтернативы, если вы хотите пропустить диапазон коммитов, вы можете указать диапазон, используя нотацию диапазона. Например:
$ git bisect skip <commit1>..<commit2>
Эта команда пропускает все коммиты между <commit1>
и <commit2>
включительно.
Пропуская нерелевантные коммиты, вы можете сосредоточить свои усилия по тестированию на коммитах, которые с большей вероятностью будут ответственны за ошибку или изменение поведения.
Советы и рекомендации
Чтобы максимально эффективно использовать Git Bisect, примите во внимание следующие советы и рекомендации:
- Четко определенные критерии. Четко определите, что представляет собой «хороший» или «плохой» коммит на основе ошибки или поведения, которое вы исследуете. Это обеспечивает согласованность в маркировке коммитов и обеспечивает точные результаты.
- Автоматические тесты. По возможности автоматизируйте свои тесты, чтобы быстро определять поведение каждой фиксации. Автоматизированные тесты помогают упростить процесс деления пополам и исключить человеческий фактор.
- Пропустить несвязанные коммиты. Если вы обнаружите коммиты, которые явно не связаны с ошибкой или изменением поведения, не стесняйтесь их пропустить. Пропуск нерелевантных коммитов помогает сузить область поиска и сэкономить время.
Заключение
Git Bisect — это мощный инструмент, который позволяет вам перемещаться по истории коммитов вашего репозитория Git и определять конкретный коммит, который привел к ошибке или вызвал изменение в поведении. Используя алгоритм бинарного поиска, Git Bisect автоматизирует процесс сужения области поиска и экономит ваше драгоценное время и усилия при отладке.
Спасибо за чтение! Любите эти истории? Поддержите меня членством в ежемесячных подборках статей. Или присоединяйтесь к Medium по моей ссылке.