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