Как я мог использовать git bisect, чтобы найти первое GOOD commit?

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

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

Хорошо. Позвольте спросить нашего друга git bisect для исправления, исправляющего ошибку:

git bisect start
git bisect bad last
git bisect good master

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

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

Какие-нибудь намеки на преодоление этого? Я что-то пропустил в документах?

Ответ 1

Как и в случае с 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, если это необходимо.

Ответ 2

Я бы просто "обманул" git и заменил значения good <= > bad.

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

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

git bisect start
git bisect good last
git bisect bad master

Ответ 3

Если вы используете git bisect run, как я делал с командой Perl 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.

Ответ 4

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,... ваш выбор!) независимо от того, ищете ли вы регрессию или исправление.

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

Ответ 5

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

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

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

По сути, это предложение @MarcH должно быть реализовано.