Учебник по Git Bisect

Комментирование ваших коммитов — важная часть поддержки отслеживаемого кода. Это помогает отслеживать проблемы. Однако найти ошибку только на основе комментариев — утомительная задача. Чтобы отсортировать всю историю и выяснить, какая фиксация является виновной, может потребоваться много времени.

Команда git bisect позволяет ускорить процесс обнаружения ошибок. Это позволяет быстрее выявить проблему. С помощью git bisect вы можете определить диапазон коммитов, которые, как вы подозреваете, содержат проблемный код, а затем использовать двоичные методы исключения, чтобы найти начало проблемы. Поиск ошибок становится быстрее и проще.

Давайте создадим пример и запустим несколько тестовых примеров, чтобы увидеть, как это работает.

Пример установки

В нашем примере мы создадим файл test.txt и добавим в него новую строку при каждой фиксации. После 16 коммитов окончательное состояние файла будет выглядеть так:

Вот мой хороший код 1
Вот мой хороший код 2
Вот мой хороший код 3
Вот мой хороший код 4
Вот мой хороший код 5
Вот мой хороший код 6
Вот мой хороший код 7
Вот мой хороший код 8
Вот мой плохой код 1 Вот мой плохой код 2
Вот мой плохой код 3
Вот мой плохой код 4
Вот мой плохой код 5
Вот мой плохой код 6
Вот мой плохой код 7
Вот мой плохой код 8
Вот мой плохой код 9

В приведенном выше примере ошибка попала в код после 8 коммитов. Мы продолжали разработку кода даже после появления ошибки.

Вы можете создать папку с именем my_bisect_test и использовать следующие команды внутри папки для создания примера ситуации:

git init

echo «Вот мой хороший код 1″> test.txt
git add -A && git commit -m «Моя фиксация 1»

echo «Вот мой хороший код 2» >> test.txt
git add -A && git commit -m «My commit 2 (v1.0.0)»

echo «Вот мой хороший код 3» >> test.txt
git add -A && git commit -m «My commit 3»

echo «Вот мой хороший код 4» >> test.txt
git add -A && git commit -m «My commit 4»

echo «Вот мой хороший code 5 «>> test.txt
git add -A && git commit -m» Моя фиксация 5 (v1.0.1) «

echo» Вот мой хороший код 6 «>> test.txt
git add -A && git commit -m» My commit 6 «

echo» Вот мой хороший код 7 «>> test.txt
git add -A && git commit -m «Моя фиксация 7 (v1.0.2)»

echo «Вот мой хороший код 8» >> tes t.txt
git add -A && git commit -m «Моя фиксация 8»

echo «Вот мой плохой код 1″> test.txt
git add -A && git commit -m «My commit 9»

echo «Вот мой плохой код 2» >> test. txt
git add -A && git commit -m «My commit 10»

echo «Вот мой плохой код 3» >> test.txt
git add -A && git commit -m «My commit 11»

echo «Вот мой плохой код 4» >> test.txt
git add -A && git commit — m «Моя фиксация 12 (v1.0.3)»

echo «Вот мой плохой код 5» >> test.txt
git add -A && git commit -m » Моя фиксация 13 «

echo» Вот мой плохой код 6 «>> test.txt
git add -A && git commit -m» Моя фиксация 14 «

echo «Вот мой плохой код 7» >> test.txt
git add -A && git commit -m «My commit 15 (v1.0.4)»

echo «Вот мой плохой код 8» >> test.txt
git add -A && git commit -m «My commit 16»


Проверка истории

Если вы посмотрите на историю коммитов, вы увидите следующее:

$ git log
commit 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Автор: Zak H
Дата: 31 декабря, 23:07:27 2017 -0800

Моя фиксация 17

фиксация 10ef0286d6459 cd5dea5038a54edf36fc9bfe4c3
Автор: Zak H
Дата: Вс 31 декабря 23:07:25 2017 -0800

Моя фиксация 16

commit 598d4c4acaeb14cda0552b6a92aa975c436d337a
Автор: Zak H
Дата: Вс 31 декабря 23:07:23 2017 -0800

Моя фиксация 15 (v1.0.4)

commit b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Автор: Zak H
Дата: 31 декабря 23:07:21 2017 -0800

Моя фиксация 14

совершить eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Автор: Zak H
Дата: 31 декабря 23:07:19 2017 -0800

Мой commit 13

commit 3cb475a4693b704793946a878007b40a1ff67cd1
Автор: Zak H
Дата: 31 декабря 23:07:17 2017 -0800

Моя фиксация 12 (v1.0.3)

commit 0419a38d898e28c4db69064478ecab7736700310
Автор: Zak H
Дата: 31 декабря 23:07:15 2017 -0800

Моя фиксация 11

commit 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Автор: Zak H
Дата: 31 декабря 23:07:13 2017 -0800

Моя фиксация 10

commit a33e366ad9f6004a61a468b48b36e0c0c802a815
Автор: Zak H
Дата: 31 декабря 23:07:11 2017 -0800

Моя фиксация 9

коммит ead472d61f516067983d7e29d548fc856d6e6868
Автор: Zak H
Дата: вс 31 декабря 23:07:09 2017 -0800

Моя фиксация 8

commit 8995d427668768af88266f1e78213506586b0157
Автор: Zak H
Дата: 31 декабря 23:07:07 2017 -0800

Моя фиксация 7 (v1.0.2)

commit be3b341559752e733c6392a16d6e87b5af52e701
Автор: Zak H
Дата: 31 декабря 23:07:05 2017 -0800

Моя фиксация 6

commit c54b58ba8f73fb464222f30c90aa72f60b99bda9
Автор: Зак Х
Дата: 31 декабря 23:07:03 2017 -0800

Моя фиксация 5 (v1.0. 1)

commit 264267111643ef5014e92e23fd2f306a10e93a64
Автор: Zak H
Дата: 31 декабря 23:07:01 2017 -0800

Моя фиксация 4

фиксация cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Автор: Zak H
Дата: 31 декабря 23:06:59 2017 -0800

Моя фиксация 3

commit 3f90793b631ddce7be509c36b0244606a2c0e8ad
Автор: Зак Х
Дата: 31 декабря 23:06:57 2017 -0800

Мой коммит 2 (v1.0.0)

коммит cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Автор: Zak H
Дата: 31 декабря 23:06:55 2017 -0800

Моя фиксация 1

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


Поиск ошибки

Давайте воспользуемся git log –online, чтобы увидеть более очищенную версию истории коммитов.

$ git log —oneline
3023b63 Моя фиксация 17
10ef028 Моя фиксация 16
598d4c4 Моя фиксация 15 (v1.0.4)
b9678b7 Моя фиксация 14
eb3f2f7 Моя фиксация 13
3cb475a Моя фиксация 12 (v1.0.3)
0419a38 Моя фиксация 11
15bc592 Моя фиксация 10
a33e366 Моя фиксация 9
ead472d Моя фиксация 8
8995d42 Моя фиксация 7 (v1.0.2)
be3b341 Моя фиксация 6
c54b58b Моя фиксация 5 (v1.0.1)
2642671 Моя фиксация 4
cfd7127 Моя фиксация 3
3f90793 Моя фиксация 2 (v1.0.0)
cc163ad Моя фиксация 1

Мы хотим найти ситуацию где на картинке появилась строка «Вот мой плохой код 1

Ситуация 1

Предположим, мы помним, что наш код был хорош до v1 .0.2, и мы хотим проверять с этого момента до последнего коммита. Сначала мы запускаем команду bisect:

$ git bisect start

Мы обеспечиваем хорошую границу и плохую границу (без хеша означает последний код):

$ git bisect good 8995d42
$ git bisect bad

Вывод:

Пополам: после этого осталось протестировать 4 ревизии (примерно 2 шага)
[3cb475a4693b704793946a878007b40a1ff67cd1] Моя фиксация 12 (v1. 0.3)

Команда bisect нашла среднюю точку в нашем определенном диапазоне и автоматически переместила код на фиксацию 12. Теперь мы можем протестировать наш код. В нашем случае мы собираемся вывести содержимое test.txt:

$ cat test.txt

Вывод:

Вот мой хороший код 1
Вот мой хороший код 2
Вот мой хороший код 3
Вот мой хороший код 4
Вот мой хороший код 5
Вот мой хороший код 6
Вот мой хороший код 7
Вот мой хороший код 8
Вот мой плохой код 1 Вот мой плохой код 2
Вот мой плохой код 3
Вот мой плохой код 4

Мы видим, что состояние test.txt находится в состоянии после ошибки. Так что он в плохом состоянии. Итак, мы сообщаем команде bisect:

$ git bisect bad

Вывод:

Пополам: после этого осталось протестировать 2 ревизии (примерно 1 шаг)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Моя фиксация 9

Он перемещает наш код в режим фиксации 9. Мы снова тестируем:

$ cat test.txt

Вывод:

Вот мой хороший код 1
Вот мой хороший код 2
Вот мой хороший код 3
Вот мой хороший код 4
Вот мой хороший код 5
Вот мой хороший код 6
Вот мой хороший код 7
Вот мой хороший код 8
Вот мой плохой код 1

Мы видим, что нашли отправную точку ошибки. Коммит «a33e366 My commit 9» является виновником.

Наконец, мы вернули все в нормальное состояние, выполнив:

$ git bisect reset

Вывод:

Предыдущая позиция HEAD была a33e366 … Моя фиксация 9
Переключился на ветку master

Ситуация 2

В том же примере давайте попробуем ситуацию, когда другой разработчик начинает с предпосылки, что ошибка появилась между v1.0.0 и v1.0.3. Мы можем начать процесс снова:

$ git bisect start
$ git bisect good 3f90793
$ git bisect bad 3cb475a

Вывод:

Биссектрисы: после этого осталось проверить 4 версии (примерно 2 шага)
[8995d427668768af88266f1e78213506586b0157] Моя фиксация 7 (v1.0.2)

Bisect переместила наш код в фиксацию 7 или v1.0.2. Запустим наш тест:

$ cat test.txt

Вывод:

Вот мой хороший код 1
Вот мой хороший код 2
Вот мой хороший код 3
Вот мой хороший код 4
Вот мой хороший код 5
Вот мой хороший код 6
Вот мой хороший код 7

Мы не не вижу плохого кода. Итак, дайте знать git bisect:

$ git bisect good

Вывод:

Пополам: после этого осталось протестировать 2 ревизии (примерно 1 шаг)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Моя фиксация 9

Это подтолкнуло нас к фиксации 9. Мы снова тестируем:

$ cat test.txt

Вывод:

Вот мой хороший код 1
Вот мой хороший код 2
Вот мой хороший код 3
Вот мой хороший код 4
Вот мой хороший код 5
Вот мой хороший код 6
Вот мой хороший код 7
Вот мой хороший код 8
Вот мой плохой код 1

Мы снова нашли фиксацию, которая привела к ошибке. Это была фиксация «a33e366 My commit 9». Несмотря на то, что мы начали с другого диапазона подозрений, мы обнаружили ту же ошибку за несколько шагов.

Давайте сбросим:

$ git bisect reset
Предыдущее положение HEAD было a33e366 … Моя фиксация 9
Перешел на ветку ‘master’

Заключение

Как видно из примера, git bisect позволяет нам быстрее выявить проблему. Это отличный инструмент для повышения вашей производительности. Вместо того, чтобы просматривать всю историю коммитов, вы можете применить более систематический подход к отладке.

Дальнейшее изучение:

https://git-scm.com/docs/git-bisect
https://git-scm.com/book/en/v2/Git-Tools-Debugging-with-Git

Оцените статью
nanomode.ru
Добавить комментарий