Как использовать git bisect?



Я читал некоторые статьи говорят, что git bisect потрясающе, однако я не носитель языка, и я не могу понять, почему это потрясающе.



не могли бы вы продемонстрировать на каком-нибудь примере кода, что в этом такого удивительного? Это так же, как svn blame?

524   6  

6 ответов:

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

... --- 0 --- 1 --- 2 --- 3 --- 4* --- 5 --- current

вы знаете, что ваша программа не работает должным образом в current ревизия, и что она работала на ревизии 0. Таким образом, регрессия, вероятно, была введена в одном из коммитов 1,2,3,4,5,current.

вы можете попробовать проверить каждый коммит, построить его, проверить, если регрессия присутствует или нет. Если есть большое количество коммитов, это может занять много времени. Это линейный поиск. Мы можем сделать лучше, выполнив двоичный поиск. Это

git bisect run автоматическое деление пополам

если у вас есть автоматизированная ./test скрипт, который имеет статус выхода 0 если тест в порядке, вы можете автоматически найти ошибку с bisect run:

git checkout KNOWN_BAD_COMMIT
git bisect start

# Confirm that our test script is correct, and fails on the bad commit.
./test
# Should output != 0.
echo $?
# Tell Git that the current commit is bad.
git bisect bad

# Same for a known good commit in the past.
git checkout KNOWN_GOOD_COMMIT
./test
# Should output 0.
echo $?
# After this, git automatically checks out to the commit
# in the middle of KNOWN_BAD_COMMIT and KNOWN_GOOD_COMMIT.
git bisect good

# Bisect automatically all the way to the first bad or last good rev.
git bisect run ./test

# End the bisect operation and checkout to master again.
git bisect reset

это предполагает, конечно, что если тестовый скрипт ./test отслеживается git, что он не исчезает на некоторых более ранних фиксациях во время деления пополам.

я обнаружил, что очень часто вы можете уйти, просто скопировав сценарий в дереве из дерева, и возможно, играя с PATH - как переменные, и запуск его оттуда вместо этого.

конечно, если тестовая инфраструктура на которой test зависит от перерывов на более старые коммиты, тогда нет решения, и вам придется делать все вручную, решая, как тестировать коммиты один за другим.

TL; DR

Start:

$ git bisect start
$ git bisect bad
$ git bisect good <goodcommit>

Bisecting: X revisions left to test after this (roughly Y steps)

повторю:

проблема все еще существует?

  • да: $ git bisect bad
  • нет: $ git bisect good

результат:

<abcdef> is the first bad commit

Когда Сделано:

git bisect reset

просто чтобы добавить еще один пункт:

можно указать имя файла или путь к git bisect start в случае, если мы знаем, что ошибка пришла из определенных файлов. Например, Предположим, мы знали, что изменения, вызвавшие регрессию, были в com / workingDir каталог, то мы можем запустить git bisect start com/workingDir Это означает, что будут проверены только коммиты, которые изменили содержимое этого каталога, и это делает вещи еще быстрее.

кроме того, если трудно сказать, если конкретный совершить это хорошо или плохо, вы может работать git bisect skip, которая будет его игнорировать. Учитывая, что есть достаточно других фиксирует, git bisect будет использовать другой, чтобы сузить поиск вместо этого.

$ git bisect .. bascically a Git для отладки. "Git Bisect" отлаживает, проходя через предыдущий commits С момента вашего последнего (известного) рабочих совершал. Он использует двоичный поиск, чтобы пройти через все эти коммиты, чтобы добраться до того, который ввел регрессию/ошибку.

$ git bisect start # начало деления пополам

$ git bisect bad # заявив, что текущая фиксация (v1. 5) имеет регрессию/ установку "плохой" точки

$ git bisect good v1.0 # упоминание об этом последний хороший рабочий коммит (без регрессии)

это упоминание "плохих" и "хороших" точек поможет git bisect (двоичный поиск) выберите средний элемент (commit v1.3). Если регрессия существует в commit v1. 3, вы установите ее как новую "плохую" точку, т. е. ( хорошо - > v1. 0 и плохо - > v1.3)

$ git bisect bad

или же, если коммит v1.3 нет ошибок, вы сможете установить его в качестве хорошей точки нового'', т. е. (*хорошо -> В1.3 и плохо -> В1.6).

$ git bisect good

Примечание: термины good и bad не единственные, которые вы можете использовать для маркировки фиксации с определенным свойством или без него.

Git 2.7 (Q4 2015) представил новый git bisect параметры.

 git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]
                  [--no-checkout] [<bad> [<good>...]] [--] [<paths>...]

С добавлением документация:

иногда вы не ищете фиксацию, которая привела к поломке, а скорее для фиксация, которая вызвала изменение между некоторым другим" старым "состоянием и" новым " состоянием.

например, вы можете искать фиксацию, которая представила конкретное исправление.
Или вы можете искать первую фиксацию, в которой имена файлов исходного кода были окончательно преобразованы в стандарт именования вашей компании. Или еще что-нибудь.

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

вместо этого, вы можете использовать термины "old" и "new", соответственно, вместо "good" и "bad".
(Но обратите внимание, что вы не можете смешивать"good" и "bad" С "old" и "new " за один сеанс.)

в этом более общем использовании, вы предоставляете git bisect С "new" commit имеет некоторое свойство и"old" commit, который не имеет этого свойства.

каждый раз git bisect проверяет фиксацию, вы проверяете, имеет ли эта фиксация свойство:
Если это делает, отметьте фиксацию как"new"; в противном случае отметьте его как "old".

когда деление будет сделано,git bisect сообщит, какая фиксация ввела свойство.


посмотреть совершить 06e6a74,совершить 21b55e3,commit fe67687 (29 июня 2015) by Matthieu Moy (moy).
Смотрите commit 21e5cfd (29 июня 2015) by Антуан Delaite (CanardChouChinois).
(слитый Junio C Hamano--gitster-- на совершить 22dd6eb, 05 окт 2015)

Comments

    Ничего не найдено.