Я прочитал несколько статей о том, что git bisect
это круто. Тем не менее, я не носитель языка и не могу понять, почему это круто.
Может ли кто-нибудь продемонстрировать пример кода:
- Как это использовать?
- Это так же, как
svn blame
?
git
git-bisect
IAdapter
источник
источник
Ответы:
Идея
git bisect
состоит в том, чтобы выполнить бинарный поиск в истории, чтобы найти определенную регрессию. Представьте, что у вас есть следующая история разработки:Вы знаете, что ваша программа не работает должным образом на
current
ревизии, и что она работала на ревизии0
. Таким образом, регрессия , вероятно , введен в одном из фиксаций1
,2
,3
,4
,5
,current
.Вы можете попробовать проверить каждый коммит, построить его, проверить, присутствует ли регрессия или нет. Если существует большое количество коммитов, это может занять много времени. Это линейный поиск. Мы можем добиться большего успеха, выполнив бинарный поиск. Это то, что
git bisect
делает команда. На каждом этапе он пытается уменьшить количество потенциально опасных ревизий вдвое.Вы будете использовать команду следующим образом:
После этой команды
git
будет оформлен коммит. В нашем случае это будет коммит3
. Вам нужно собрать свою программу и проверить, присутствует ли регрессия. Вам также нужно будет сообщитьgit
статус этой ревизии либо,git bisect bad
если регрессия присутствует, либоgit bisect good
ее нет.Давайте предположим, что регрессия была введена в коммите
4
. Тогда регрессии нет в этой ревизии, и мы говорим этоgit
.Затем он извлечет еще один коммит. Либо
4
или5
(так как есть только два коммита). Давайте предположим, что это выбрано5
. После сборки мы тестируем программу и видим, что регрессия присутствует. Затем мы говорим этоgit
:Мы проверяем последнюю ревизию
4
. И поскольку именно он ввел регрессию, мы говорим этоgit
:В этой простой ситуации, мы должны были только тест 3 версии (
3
,4
,5
) вместо 4 (1
,2
,3
,4
). Это маленькая победа, но это потому, что наша история такая маленькая. Если диапазон поиска имеет N коммитов, мы должны ожидать, что 1 + log2 N коммитов будет использоватьсяgit bisect
вместо примерно N / 2 коммитов с линейным поиском.Как только вы нашли коммит, который ввел регрессию, вы можете изучить его, чтобы найти проблему. Как только это будет сделано, вы используете,
git bisect reset
чтобы вернуть все в исходное состояние перед использованиемgit bisect
команды.источник
git bisect bad <rev> [<rev>...]
чтобы пометить определенные ревизии как плохие (или хорошие сgit bisect good <rev> [<rev>...]
).rev
может быть любым идентификатором ревизии, таким как имя ветви, тег, хеш коммита (или уникальный префикс хэша коммита), ...git bisect reset
git bisect run
автоматический разделЕсли у вас есть автоматический
./test
скрипт, который имеет статус выхода 0, если тест в порядке, вы можете автоматически найти ошибку с помощьюbisect run
:Это, конечно, предполагает, что если тестовый скрипт
./test
отслеживается в git, он не исчезает при более раннем коммите во время деления пополам.Я обнаружил, что очень часто вы можете уйти, просто скопировав скрипт из дерева из дерева, и, возможно, поиграв с
PATH
переменными, подобными переменным, и запустив его вместо этого.Конечно, если тестовая инфраструктура, от которой
test
зависит, прерывается от старых коммитов, то решения не существует, и вам придется делать что-то вручную, решая, как тестировать коммиты один за другим.Однако я обнаружил, что использование этой автоматизации часто работает и может значительно сэкономить время для более медленных тестов, лежащих в вашем списке невыполненных задач, где вы можете просто позволить ему работать в одночасье и, возможно, определить вашу ошибку к следующему утру. попытка
Дополнительные советы
Оставайтесь на первом неудачном коммите после деления пополам вместо того, чтобы возвращаться к
master
:start
+ начальныйbad
иgood
за один раз:такой же как:
Посмотрите, что было проверено до сих пор (вручную
good
иbad
илиrun
):Пример вывода:
Покажите хорошие и плохие ссылки на git log, чтобы получить лучшее представление о времени:
Это показывает только коммиты с соответствующей ссылкой, которая уменьшает шум, но включает автоматически сгенерированные ссылки типа:
которые говорят нам, какие обязательства мы отметили как хорошие или плохие.
Рассмотрите это тестовое репо, если вы хотите поиграть с командой.
Отказ быстр, успех медленный
Иногда:
Для таких случаев, например, предположим, что сбой всегда происходит в течение 5 секунд, и если нам лень сделать тест более конкретным, чем мы должны, мы можем использовать
timeout
какЭто работает с
timeout
выходами в124
то время как отказtest-command
выходов1
.Магические статусы выхода
git bisect run
немного требователен к статусам выхода:все, что выше 127, приводит к сбою деления пополам с чем-то вроде:
В частности, C
assert(0)
ведет к aSIGABRT
и выходит со статусом 134, что очень раздражает.125 - это магия, с которой можно пропустить бег
git bisect skip
.Цель этого состоит в том, чтобы помочь пропускать неработающие сборки по несвязанным причинам.
Смотрите
man git-bisect
подробности.Так что вы можете использовать что-то вроде:
Проверено на git 2.16.1.
источник
test_script
модульным набором тестов и запустите его из отдельного файла, разделив пополам. Когда вы исправите, объедините тест с основным набором тестов.bisect run
особенно полезным, когда тестирование занимает много времени, и я почти уверен, что тестовая система не сломается. Таким образом, я могу просто оставить его работать в фоновом режиме или в одночасье, если он потребует слишком много ресурсов, не теряя времени на переключение контекста мозга.TL; DR
Начните:
Bisecting: X revisions left to test after this (roughly Y steps)
Повторение:
Проблема все еще существует?
$ git bisect bad
$ git bisect good
Результат:
Когда сделано:
источник
git bisect good
чтобы перейти к следующему коммиту.Просто чтобы добавить еще один пункт:
Мы можем указать имя файла или путь к нему
git bisect start
в случае, если мы знаем, что ошибка произошла из определенных файлов. Например, предположим, что мы знали, что изменения, вызвавшие регрессию, были в каталоге com / workingDir, после чего мы можем выполнить.git bisect start com/workingDir
Это означает, что будут проверяться только те коммиты, которые изменили содержимое этого каталога, и это делает вещи еще быстрее.Кроме того, если вам сложно определить, хорош ли тот или иной коммит, вы можете запустить его
git bisect skip
, и он будет игнорироваться. Поскольку других коммитов достаточно, git bisect будет использовать другой, чтобы сузить поиск.источник
$ git bisect ..
в основном инструмент Git для отладки . «Git Bisect» отлаживает, выполняя предыдущие коммиты с момента вашего последнего (известного) рабочего коммита. Он использует бинарный поиск, чтобы пройти через все эти коммиты, чтобы добраться до того, который ввел регрессию / ошибку.$ git bisect start
# Начальный биссект$ git bisect bad
# заявив, что текущий коммит (v1.5) имеет точку регрессии / установки 'плохой'$ git bisect good v1.0
# упоминая это последний хороший рабочий коммит (без регрессии)Это упоминание о «плохих» и «хороших» точках поможет git bisect (бинарный поиск) выбрать средний элемент (commit v1.3). Если регрессия присутствует в коммите v1.3, вы установите его в качестве новой «плохой» точки, т.е. ( Good -> v1.0 и Bad -> v1.3 )
или аналогично, если коммит v1.3 не содержит ошибок, вы установите его в качестве новой «Хорошей точки», т. е. (* Good -> v1.3 и Bad -> v1.6).
источник
Примечание: термины
good
иbad
не единственные, которые вы можете использовать для пометки коммита с определенным свойством или без него.Git 2.7 (четвертый квартал 2015 года) представил новые
git bisect
опции.С добавлением документации:
См. Коммит 06e6a74 , коммит 21b55e3 , коммит fe67687 (29 июня 2015 г.) от Matthieu Moy (
moy
) .См. Коммит 21e5cfd (29 июня 2015 г.) Антуана Делайта (
CanardChouChinois
) .(Слиты Junio C Hamano -
gitster
- в фиксации 22dd6eb , 5 октября 2015)источник