Как я могу использовать 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/