Git bisect не работает, нет вывода

Я пытался использовать 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 - версия 1.6.3.3 на Ubuntu 9.10 Любые идеи?

Ответ 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 вернет вас туда, где вы начали.

Ответ 2

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

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

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

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

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

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

после этого bisect начнет работать автоматически. Вам все равно придется взаимодействовать с ним и сказать, что состояние деления пополам совершает, хотя (или написать script, чтобы его автоматизировать).