Git
Биссекция / поиск ошибочных обязательств
Поиск…
Синтаксис
git bisect <subcommand> <options>
git bisect start <bad> [<good>...]
git bisect reset
git bisect good
git bisect bad
Бинарный поиск (git bisect)
git bisect
позволяет вам найти, какая фиксация ввела ошибку, используя двоичный поиск.
Начните с дебазации сеанса путем предоставления двух ссылок на фиксацию: хорошая фиксация перед ошибкой и неудачная фиксация после ошибки. Как правило, плохой фиксацией является HEAD
.
# start the git bisect session
$ git bisect start
# give a commit where the bug doesn't exist
$ git bisect good 49c747d
# give a commit where the bug exist
$ git bisect bad HEAD
git
запускает двоичный поиск: он разделяет ревизию пополам и переключает репозиторий на промежуточную ревизию. Проверьте код, чтобы определить, хороша или плохая ревизия:
# tell git the revision is good,
# which means it doesn't contain the bug
$ git bisect good
# if the revision contains the bug,
# then tell git it's bad
$ git bisect bad
git
продолжит выполнение двоичного поиска по каждому оставшемуся подмножеству плохих версий в зависимости от ваших инструкций. git
представит единственную ревизию, которая, если бы ваши флаги не были неправильными, будет представлять собой именно ту версию, где была введена ошибка.
Впоследствии помните, чтобы запустить git bisect reset
чтобы завершить сеанс bisect и вернуться в HEAD.
$ git bisect reset
Если у вас есть скрипт, который может проверить наличие ошибки, вы можете автоматизировать процесс с помощью:
$ git bisect run [script] [arguments]
Где [script]
- это путь к вашему скрипту, а [arguments]
- это любые аргументы, которые должны быть переданы вашему скрипту.
Выполнение этой команды будет автоматически выполняться через двоичный поиск, выполняя git bisect good
или git bisect bad
на каждом шаге в зависимости от кода выхода вашего скрипта. Выход с 0 указывает на good
, а выход с 1-124, 126 или 127 указывает на плохое. 125 указывает, что сценарий не может протестировать эту ревизию (которая приведет к git bisect skip
).
Полуавтоматически найдите ошибочную фиксацию
Представьте, что вы находитесь на master
ветке, и что-то не работает должным образом (регрессия была введена), но вы не знаете, где. Все, что вы знаете, это то, что работало в последнем выпуске (например, с тегом или вы знаете хеш-код фиксации, давайте возьмем old-rel
здесь).
Git помогает вам, обнаружив ошибочную фиксацию, которая вводила регрессию с очень небольшим количеством шагов (двоичный поиск).
Прежде всего начните деление пополам:
git bisect start master old-rel
Это скажет git, что master
- это сломанная ревизия (или первая сломанная версия), а old-rel
- последняя известная версия.
Теперь Git проверит отдельную голову в середине обоих коммитов. Теперь вы можете провести тестирование. В зависимости от того, работает ли это или нет
git bisect good
или же
git bisect bad
, В случае, если эта фиксация не может быть протестирована, вы можете легко git reset
и протестировать ее, git willl позаботится об этом.
После нескольких шагов git выведет ошибочный хеш фиксации.
Чтобы прервать процесс bisect, просто выполните
git bisect reset
и git восстановит предыдущее состояние.