Як я міг використовувати git bisect, щоб знайти перший ДОБРИЙ коміт?


90

У мене така проблема:

  • версія masterпрацює нормально
  • версія останнього тегу до master(скажімо last) має помилку
  • колега потребує виправлення для його lastперегляду для цієї певної помилки

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

git bisect start
git bisect bad last
git bisect good master

Але це не спрацює:

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

Будь-які підказки, щоб подолати це? Я щось пропустив у документах?


1
Я біжу, git bisect run ...щоб автоматизувати бісекцію. Тож у мене немає шансів просто поміняти слова goodі bad(це було занадто очевидно). Як використовувати, runщоб знайти першу хорошу редакцію?
Даніель Бемер

@ DanielBöhmer: Ви повинні поміняти місцями терміни всередині вашого сценарію, що працює, чи не так?
еккес

Сценарій, який виконується, git bisect runповертає хороше чи погане як код виходу, а не як рядок. Дивіться мою відповідь, яку я щойно розмістив нижче.
Даніель Бемер

@ DanielBöhmer: ну, у такому випадку вам доведеться інвертувати код повернення, чи не так?
еккес

Правильно, ось що описано в моїй відповіді.
Даніель Бемер

Відповіді:


98

Починаючи з 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за необхідністю.


5
Окрім того, git не дозволяє створювати псевдоніми підкоманд. Звідси тире. Якщо це насправді можливо (або можливо) можливо, сподіваємось, хтось оновить відповідь.
Michael Wolf

3
Навіть якщо ви використовуєте псевдоніми, вихід з git не буде, тому він все одно буде повідомляти foo is the first bad commit, тому, здається, тимчасове навчання все одно необхідне, ні?
ThomasW

2
Справедливий момент. (Підтримав ваш коментар.) Хоча навіть сподіваємось, це принаймні трохи менше додаткового когнітивного навантаження, з яким потрібно боротися, і як програмісти ми вже маємо багато.
Michael Wolf

1
Я рекомендую використовувати псевдоніми "до" і "після". Таким чином, у вас немає когнітивних накладних витрат на інверсію "коли я бачу помилку, я повинен написати" добре ""; натомість у вас є лише - ймовірно менші - накладні витрати на те, щоб пам’ятати, що ви шукаєте появу / зникнення помилки (тобто пам’ятаєте, яку зміну ви шукаєте - «перед чим?»).
Jonas Kölker,

1
@ JonasKölker, це чудова ідея. Я використав запропоновані псевдоніми у відповіді, а також bisect-after = bisect badі bisect-before = bisect good, відповідно до вашої рекомендації. Тепер я можу використовувати будь-який набір псевдонімів. Ми побачимо, що я в кінцевому підсумку надаю перевагу більше після кількох використання.
Габріель Стейплз,

47

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

Іншими словами, розглядайте "поганий" як щось, що не викликає проблем, тому це не "хороша" версія, на якій базується ваш патч.

Хороше і погане - це все одно досить суб’єктивні поняття, так? :)

git bisect start
git bisect good last
git bisect bad master

2
Ну, якщо ви задумаєтесь, немає загального значення, що таке добре чи погане (мабуть, навіть не в релігії) .. це просто залежить від ваших цілей. Таким чином, це насправді не обман - але, можливо, Git's Sin (залишатися на релігійній темі: D - це підібрати такий спірний термін, а не більш нейтральну "мету" / "походження" .. Але так, філософія може бути уважною - boggling ;-)
inger

Це, мабуть, перший раз, коли я чую, що помилки можуть бути "хорошими".
MarcH

1
Це я зробив до того, як знайшов це запитання. Я більше не збираюся цього робити. Пам'ятайте, що потрібно лише одна неправильна відповідь, перш ніж вся бісекція зіпсується. Не викручуй розуму.
проскі

20

Якщо ви використовуєте, git bisect runяк я робив з proveкомандою Perl (яка запускає автоматичні тести), у вас немає шансів просто поміняти місцями 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.


Я згоден, я б не хотів модифікувати свій тест, тому це ідеально.
Seanlinsley,

8

Git тепер дозволяє вам використовувати їх oldі newбез попереднього визначення. Вам потрібно зателефонувати git bisect startбез комітів як додаткові аргументи, а потім правильно розпочати бісекцію за допомогою виклику

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

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

Це по суті те, що @MarcH пропонував запровадити.


1
Це найбільш відповідна відповідь (для сучасної git). І командою старту має бути (за посиланням, яким ви поділилися):git bisect start --term-new fixed --term-old broken
Сем Проценко

Правда. Коли були введені ці варіанти? Я хотів би оновити свою відповідь.
Michael Wolf

@MichaelWolf Вони з'явилися у версії 2.7.0 .
GKFX,

6

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/


Від: git.github.io/rev_news/2015/07/08/edition-5 "Деякі серії виправлень поліруються, щоб дозволити git bisect використовувати довільну пару термінів замість хороших і поганих, ..."
MarcH
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.