Как я могу использовать git bisect, чтобы найти первый ХОРОШИЙ коммит?

У меня есть следующая проблема:

  • версия на master работает отлично
  • версия последнего тега перед master (сказать last) есть ошибка
  • коллеге нужен патч для его last ревизия для этой определенной ошибки

Хорошо. Давайте спросим нашего друга git bisect для ревизии, которая исправила ошибку:

git bisect start
git bisect bad last
git bisect good master

Но это не сработает

Некоторые хорошие обороты не являются предками плохого оборота.
git bisect не может работать должным образом в этом случае.
Может быть, вы перепутали хорошие и плохие обороты?

Любые намеки, чтобы преодолеть это? Я что-то пропустил в документах?

5 ответов

Решение

Начиная с git 2.7, вы можете использовать аргументы --term-old и --term-new.

Например, вы можете определить фиксацию для устранения проблемы следующим образом:

git bisect start --term-new=fixed --term-old=unfixed
git bisect fixed master
git bisect unfixed $some-old-sha1

Пока вы тестируете, говорите git bisect fixed или же git bisect unfixed по мере необходимости.

Старый ответ, для версий git до 2.7

Вместо того, чтобы временно приучить себя думать, что плохое означает хорошее, а хорошее - плохое, почему бы не создать псевдонимы?

В ~/.gitconfig добавить следующее:

[alias]
        bisect-fixed = bisect bad
        bisect-unfixed = bisect good

Вы можете начать определять фиксацию для устранения проблемы следующим образом:

$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1

Пока вы тестируете, говорите git bisect-fixed или же git bisect-unfixed по мере необходимости.

Я бы просто "обманул" мерзавца и поменял значения на хорошие <=> плохие.

Другими словами, считайте "плохим" то, что не представляет проблемы, так что это не "хорошая" версия, на которой будет основан ваш патч.

В любом случае, хорошее и плохое - это довольно субъективные понятия, верно?:)

git bisect start
git bisect good last
git bisect bad master

Если вы используете git bisect run как я делал с Perl's prove команда (которая запускает автоматические тесты) у вас нет шансов просто поменяться good а также bad, Успешность тестов будет сообщаться как код выхода.

Я нашел правильный синтаксис Bash для отмены кода завершения программы, запускаемой git bisect run:

git bisect start
git bisect bad HEAD                 # last revision known to PASS the tests
git bisect good $LAST_FAIL_REVISION # last revision known to FAIL the tests
git bisect run bash -c "! prove"

Это дало мне первую ревизию, чтобы пройти тесты prove,

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

git bisect old <rev>
git bisect new <rev>

https://git-scm.com/docs/git-bisect

По сути, это то, что @MarcH предлагал реализовать.

Git псевдонимы хорошая идея, однако условия fixed а также unfixed имеют ту же проблему, чем good а также bad Вы не можете быть совместимы с регрессиями и прогрессиями. Легко найти слова, которые работают в любом случае: просто возьмите их из оригинальной терминологии бинарного поиска, которая по своей природе нейтральна, без предвзятого мнения о том, что хорошо, а что плохо. Например:

git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low  'bisect good'

С такими нейтральными терминами вы всегда можете набрать: git bisect-high (или же git bisect-upper, или же git-bisect max... ваш выбор!) ищете ли вы регрессию или исправление.

Жаль, что разработчики git bisect не могли просто повторно использовать ни один из существующих терминов. Вообще говоря, пользовательский интерфейс не является проблемой Git: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/

Другие вопросы по тегам