git bisect не работает, нет вывода - PullRequest
11 голосов
/ 12 января 2010

Я пытался использовать git bisect в последнее время, но это просто не сработало. Дерево осталось в хозяине, и я ничего не видел от git bisect. Вот что я попробовал:

git bisect start
git bisect bad   # no output, tried a couple of times
git bisect good  # no output
git bisect reset #-> Already on 'master'

Я пробовал это на двух разных репо. Не сработало git --version - это 1.6.3.3 в Ubuntu 9.10 Есть идеи?

Ответы [ 2 ]

18 голосов
/ 12 января 2010

Введение в Git Bisect

"git bisect" может сначала немного запутать. Как только вы поймете, что он делает, это будет легко.

Типичный сценарий для "git bisect": только что обнаружена ошибка. Вы хотите узнать, какая версия внесла ошибку. Вы знаете, что ошибка существует в последней версии, но она была введена в предыдущей версии. Вам понадобится способ выяснить, существует ли ошибка. Это может быть автоматический тест или ручной тест.

Давайте начнем. Начиная с последней версии вашей ветки, введите:

git bisect start

А затем скажите git, что текущая версия известна как плохая:

git bisect bad

Теперь нам нужно найти хороший рев. Отметьте что-нибудь достаточно старое, чтобы не было ошибки. Если вы считаете, что 32 оборота назад должны быть хорошими, тогда:

git checkout HEAD~32

И запустите свой тест, чтобы увидеть, есть ли в нем ошибка. Если в нем есть ошибка, вам нужно попробовать еще более старую версию (просто снова введите «git checkout HEAD ~ 32»). Как только вы окажетесь на оборотах, в которых нет ошибки, тогда:

git bisect good

Это говорит git, что текущая версия хороша. Git немедленно проверит оборот между хорошим и плохим оборотом; вы увидите вывод, например:

$ git bisect good
Bisecting: 7 revisions left to test after this (roughly 3 steps)
[909ba8cd7698720d00b2d10738f6d970a8955be4] Added convenience delegators to Cache

Запустите тест и, в зависимости от результатов теста, введите одну из следующих команд:

  • git bisect good # the test passed
  • git bisect bad # the test failed
  • git bisect skip # we can't run the test on this rev for some reason (doesn't compile, etc.)

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

b25ab3cee963f4738264c9c9b5a8d1a344a94623 is the first bad commit
commit b25ab3cee963f4738264c9c9b5a8d1a344a94623
Author: Wayne Conrad <wconrad@yagni.com>
Date:   Fri Dec 25 18:20:54 2009 -0700

    More tests and refactoring

:040000 040000 6ff7502d5828598af55c7517fd9626ba019b16aa 39f346cb5a289cdb0955fcbba552f40e704b7e65 M      routecalc

И ваш текущий оборот будет там при первом плохом коммите.

Запуск git bisect "hands off"

Если ваш тест автоматический, то вы можете позволить git выполнять всю работу. Сделайте все, что вы сделали, чтобы начать выше:

git bisect start
git bisect bad
git checkout HEAD~32    # or however far back it takes to find a good rev
git bisect good

А теперь по волшебству. Все, что вам нужно, это тестовая программа, которая возвращает код завершения «0» для успеха и 1 (например) для неудачи. Расскажите git о своем тесте:

git bisect run tests/mytest.rb

Git теперь будет запускать тест, используя результаты для автоматического выполнения "git bisect good" или "git bisect bad". Это будет продолжаться до тех пор, пока не будет найден коммит с ошибкой. Все, что вам нужно сделать, это сидеть сложа руки и смотреть.

Когда вы закончите

Когда вы закончите, введите:

git bisect reset

Git вернет вас туда, откуда вы начали.

1 голос
/ 07 августа 2014

То, что вы пробовали, не удалось, потому что вы сказали, что одно и то же дерево было и хорошо, и плохо что, очевидно, не имеет никакого смысла

git bisect start # tells git you want to do a bisect operation
git bisect bad # tells git the current treesh (HEAD) is bad
git bisect good # tells git the current treeish (HEAD) is good

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

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

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

git bisect start
git bisect bad # tells it HEAD is bad
git bisect good abc123   # treeish of the good commit

после этого процесс запуска автоматически запускается. Вам все равно придется взаимодействовать с ним и сообщать ему состояние делений на две части (или написать скрипт для его автоматизации).

...