Git bisect: как определить ошибку в коде?



Из этой статьи о git bisect вы узнаете, как команда «git bisect» помогает обнаружить первую неверную фиксацию, которая приводит к ошибке, с использованием алгоритма двоичного поиска.

Мой код работал нормально до вчерашнего дня, но только после недавнего извлечения из удаленного репозитория код сломался !!!

Если вы находитесь в подобной ситуации и не знаете какие изменения сломал код или кто из многих участников владеет этот ошибка / функция , тогда git bisect - ваш выход. Итак, в этой статье о git bisect вы узнаете, какgit bisect'Команда приходит спасение в обнаружении первой плохой фиксации, которая вводит ошибку, с помощью алгоритма двоичного поиска.

В этой статье рассматриваются следующие темы:





Зачем использовать git bisect?

Нет сомнений в том, что вы, как правило, создаете несколько коммитов для каждого незначительного изменения в . В таком сценарии отладка кода становится утомительной задачей, так как вам нужно вручную возвращаться во времени к каждой редакции моментального снимка проекта, чтобы протестировать рабочий код и обнаружить ошибку. Теперь это становится еще больше сложный когда у вас есть работа другого, которую нужно проверять без зацепки, также нереально просить каждого исправить свои ошибки.
Попутно вы также можете создать и отбросить несколько веток «функций» (или исправлений) в процессе, что приведет к потере времени и усилий, отклоняясь от основного направления разработки.



Итак, чтобы избежать таких сценариев, вы можете использоватьgit bisectкоманда, чтобы найти плохую версию проекта (или снимок) и в конечном итоге исправить ее с помощьюgit revertкоманда.

Как выполняется поиск с помощью git bisect?



Эта команда делит пополам (делит) вашу историю между хорошо и плохой совершить ассортимент. Это указывает на ваш текущий проект штат к средний диапазон совершить снимок. Затем команда git bisect проходит через каждый идентификатор фиксации между этим диапазоном, пока пауза на каждом снимке, чтобы вы могли протестировать код . Если ошибка существует, вы объявляете фиксацию как плохой, если не как хорошо если поиск не закончится.

Синтаксис

git bisect

Чтобы лучше понять git bisect, давайте создадим проект, который разрабатывает код для простого навигационного приложения, которое будет использоваться в автомобиле.

Первоначальная настройка проекта

Чтобы создать проект, который разрабатывает код для простого навигационного приложения, которое будет использоваться в автомобиле, вы можете выполнить следующие шаги:

Шаг 1: Создайте новый каталог в папке $ HOME:

cd $ HOME mkdir my_nav_app

Шаг 2: Перейдите в новый каталог:

cd $ my_nav_app

Шаг 3: Клонировать для загрузки проекта со страницы GitHub:

git clone https://github.com/divyabhushan/my_nav_app.git

Теперь давайте разберемся с каталогами проекта и расположением файлов, напечатанными командой:ls -lTR

Макет исходного кода - Git Bisect - Edureka

Затем давайте посмотрим журнал истории проекта, чтобы просмотреть коммиты, которые я сделал, чтобы сгенерировать этот код -

Например, простая команда git log выводит историю в подробностях, однако мне нравится красиво форматировать и настраивать историю. Тем самым позвольте нам установить псевдоним - «hist» с использованием git псевдоним команда, как показано ниже:

git alias.hist 'log --pretty = format:'% C (желтый)% h% Creset% ad | % C (зеленый)% s% Creset% C (красный)% d% Creset% C (синий) [% an] '--graph --decorate --date = short'

Теперь я собираюсь выполнить эту функцию исправления ошибок в отдельной ветке, чтобы не мешать основной разработке ветки «master». Для этого выполните следующий набор команд:

  • Создайте ветку «dev»: [мастер] $git ветка dev
  • Перейдите в ветку «dev»: $git checkout dev
  • Список журналов истории: [разработчик] $иди[Примечание: здесь используется команда alias]

Кроме того, я выделил последнюю известную хорошую фиксацию, в которой мой скрипт работал нормально с ожидаемыми результатами тестового примера, этот снимок фиксации отмечен как v1.0.

Итак, теперь, когда мы знаем нашу последнюю удачную фиксацию, давайте продолжим в этой статье, посвященную «git bisect», и протестируем приложение.

Протестируйте приложение

Запустите скрипт как - $./scripts/myApplication.sh[тестирование впервые]



Ясно, что мое текущее состояние проекта находится в ошибка , и я не уверен, какое изменение я внес в какой коммит, который внес это изменение. Итак, теперь в этой статье о git bisect давайте посмотрим, как определить плохую фиксацию.

Выявление плохой фиксации

Чтобы начать проверку на наличие плохой фиксации, вы должны выполнить следующие шаги:

  • Запустите команду bisect :git bisect start
  • Упомяните идентификатор плохой фиксации: git bisect плохая головаилиgit bisect c5b3ca8
  • Упомяните идентификатор последней удачной фиксации: git bisect хорошо v1.0илиgit bisect 93859d8

Это делит диапазон истории коммитов пополам примерно на полпути между хорошими и плохими коммитами, что приводит нас к идентификатору фиксации: f61a7e8

Следовательно, команда проверила версию проекта, как это было в этом идентификаторе фиксации. Теперь давайте продолжим и снова протестируем наше приложение.

Команда для запуска приложения : $./scripts/myApplication.sh[тестирование второй раз]


Поскольку приложение прошло в этом коммите этот коммит определенно не плохой. Итак, затем вы должны сообщить команде bisect то же самое, что и - $git bisect хорошо


Теперь это еще больше сузит результат поиска до первой половины диапазона, как показано -


Еще раз протестируйте свое приложение - Команда: $./scripts/myApplication.sh[тестирование в третий раз]


Итак, поскольку мы видим ошибку, как указано выше, это плохая фиксация.

Сообщите команде bisect, запустите $git bisect плохо


Это еще больше сузит область поиска и приведет вас к последней версии, обведенной синим кружком: a6ac769

Итак, я тестирую свое приложение в последний раз, используя ту же команду: $./scripts/myApplication.sh[тестирование четвертый раз]

Теперь, когда приложение снова не удалось, это все еще плохая фиксация. Итак, давайте выполним следующую команду:

Выполните команду: git bisect плохо

Обнаружена плохая фиксация

Это завершает последнюю оставшуюся фиксацию, что плохо -


Итак, вы знаете, что здесь сломался код. Что дальше?

Понять, в каком файле была ошибка

В этом случае вывод дает минимальную информацию о идентификатор фиксации , имя автора , а дата создания вместе с зафиксировать сообщение и дорожка это было изменено.

Если вы хотите продолжить отладку, вам необходимо читать то зафиксировать идентификатор объекта .

Команда: git показать a6ac76994b3f6c7519204f910fc787b7928cf8ef

Это прочитает объект фиксации и напечатает сообщение журнала и текстовый diff.

Вы также можете использовать команду «git blame», чтобы проанализировать, как и в каком коммите каждая строка была изменена каким автором, запустите команду как:git виноват код / ​​develop_nav.sh

Прекратить поиск

Чтобы остановить поиск, используйте следующую команду:

Команда: git bisect reset


Таким образом, процесс деления пополам останавливается, и вы снова возвращаетесь на ту ветку, с которой начали поиск. Теперь следующий шаг - исправить или отладить код.

Как исправить / отладить код?

Что ж, есть несколько обходных путей, которые вы можете сделать, чтобы исправить текущее состояние проекта, теперь, когда вы определили фиксацию, которая изначально привела к ошибке.
Однако, если вы изменяете фиксацию на общий репозиторий лучше всего вернуться изменение с помощью ‘ git revert ‘Команда.

Задача: Отменить изменения, сделанные упомянутым плохим коммитом

Команда: git revert a6ac769

В результате отмена изменений, сделанных этим коммитом, сделала 2 вещи:

  • Он удалил последние 3 добавленные строки (обозначены зеленым) и добавил удаленную строку (обозначен красным) обратно. (обратная сторона a6ac769)
  • Создан дополнительный коммит с информацией о сообщении возврата

«Команда Revert также упрощает отслеживание изменений, которые вы отменили из исходной фиксации»

вопросы на собеседовании с загрузчиком классов Java

Использовать 'шоу' команду снова, чтобы прочитать идентификатор объекта, например, так

Команда: git показать 801f029

Теперь идите вперед и протестируйте приложение. Он будет работать правильно.

Команда: $./scripts/myApplication.sh

Напротив, если вы хотите удалить плохую фиксацию из истории:

  • Вы можете использовать ' git сбросить ‘С символом“--жесткий»(Хотя не рекомендуется в общем репозитории).

  • Проверьте более раннюю версию отдельного файла с помощью кнопки ‘git checkout‘Командой‘-‘Вариант.

Следует отметить, что это внесет изменения только в ваш локальный репозиторий, пока вы не отправите изменения в удаленный репозиторий. Поскольку некоторые изменения создают новый идентификатор объекта фиксации, как в нашем случае выше, в таких случаях обычная отправка в удаленный репозиторий отклоняется, поскольку история разошлась бы. Вы должны использовать ' git push ‘Командой‘- сила‘Вариант.

Обновите ветку master

Хотя я исправил ошибку в ветке «dev», теперь я могу объединить это изменение с веткой «master» также:

  • переключиться на «мастер», команда:мастер проверки git
  • вытащить последние обновления из 'origin / master' в 'master', команда:git pull origin
  • объединить изменения «dev», команда:git слияние гигант

Однако ваше слияние может вызвать конфликты, если из удаленного репозитория будет больше коммитов. Разрешите конфликты и продолжите слияние.
Наконец, отправьте только стабильную «главную» ветку, которая фиксируется в удаленном репозитории, в то время как ваша грязная работа (ошибка, функции, улучшения) выполняется только с ветвями функций, такими как «dev» в этом примере.
Более того, лучше принять логический стратегия ветвления чтобы упростить и обезопасить рабочий процесс git.

Подводя итог, «git bisect» - удобная и полезная команда, которая быстро идентифицировать то идентификатор фиксации это представил к вина в вашем рабочем коде с помощью обширного бинарный поиск по логике разделение журналы фиксации на полпути между хорошо и плохой совершить ассортимент . В заключение, вы научились обнаруживать ошибочная фиксация и вернуться сделанное им изменение.

Помимо подкоманд «хорошо» и «плохо» вы также можете использовать такие термины, как новый и старый, для описания состояния редакции. Вы можете запускать команду несколько раз, передавая разные подкоманды и идентификаторы ревизии / фиксации, чтобы идентифицировать разные идентификаторы фиксации (she-1). В качестве альтернативы с помощью этой команды можно также запустить сценарий автоматического тестирования для создания неработающего кода. Также найдите подробное описание этой команды, запустивgit bisect --helpна терминале. Итак, ребята, мы подошли к концу статьи о Git Bisect.

Цель DevOps - быстрее и надежнее создавать более качественное программное обеспечение, обеспечивая при этом более тесное общение и сотрудничество между командами. Если вас заинтриговала эта статья, c черт возьми от Edureka, надежной компании по онлайн-обучению с сетью из более чем 250 000 довольных учащихся по всему миру. Учебный курс Edureka DevOps Certification Training помогает учащимся понять, что такое DevOps, и получить опыт работы с различными процессами и инструментами DevOps, такими как Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack и GIT для автоматизации нескольких этапов в SDLC.

Есть вопрос к нам? Пожалуйста, укажите это в комментариях к статье «Git Bisect», и мы свяжемся с вами как можно скорее.