Ответ 1
Введение в Git Bisect
"git bisect" может быть немного запутанным вначале. Как только вы поймете, что он делает, это будет легко.
Типичным scenerio для "git bisect" является: Обнаружена ошибка. Вы хотите узнать, какой rev представил ошибку. Вы знаете, что ошибка существует в последнем rev, но она была введена в предыдущем rev. Вам понадобится способ выяснить, существует ли ошибка. Это может быть автоматический тест, или это может быть тест, который вы выполняете вручную.
Давайте начнем. Начиная с последнего оборота в вашем филиале, укажите:
git bisect start
И затем сообщите Git, что текущая версия, как известно, плохая:
git bisect bad
Теперь нам нужно найти хороший оборот. Проверьте одно достаточно старое, чтобы не было ошибки. Если вы думаете, что 32 оборота назад должны быть хорошими, то:
git checkout HEAD~32
И запустите свой тест, чтобы узнать, есть ли у него ошибка. Если у него есть ошибка, вам нужно попробовать еще более старый rev (просто выпустить "git checkout HEAD ~ 32" снова). Как только вы приземлитесь на rev, у которого нет ошибки, тогда:
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 <[email protected]>
Date: Fri Dec 25 18:20:54 2009 -0700
More tests and refactoring
:040000 040000 6ff7502d5828598af55c7517fd9626ba019b16aa 39f346cb5a289cdb0955fcbba552f40e704b7e65 M routecalc
И ваш текущий оборот будет там, при первом плохом коммите.
Запуск Git bisect "отключение руки"
Если ваш тест является автоматическим, вы можете позволить 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 вернет вас туда, где вы начали.