Git

Учебное пособие по Git Bisect

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

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

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

Пример настройки

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

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

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

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

git init
echo "Вот мой хороший код 1"> test.текст
git add -A && git commit -m "Моя фиксация 1"
echo "Вот мой хороший код 2" >> test.текст
git add -A && git commit -m "Моя фиксация 2 (v1.0.0) "
echo "Вот мой хороший код 3" >> test.текст
git add -A && git commit -m "Моя фиксация 3"
echo "Вот мой хороший код 4" >> test.текст
git add -A && git commit -m "Моя фиксация 4"
echo "Вот мой хороший код 5" >> test.текст
git add -A && git commit -m "Моя фиксация 5 (v1.0.1) "
echo "Вот мой хороший код 6" >> test.текст
git add -A && git commit -m "Моя фиксация 6"
echo "Вот мой хороший код 7" >> test.текст
git add -A && git commit -m "Моя фиксация 7 (v1.0.2) "
echo "Вот мой хороший код 8" >> test.текст
git add -A && git commit -m "Моя фиксация 8"
echo "Вот мой плохой код 1"> test.текст
git add -A && git commit -m "Моя фиксация 9"
echo "Вот мой плохой код 2" >> test.текст
git add -A && git commit -m "Моя фиксация 10"
echo "Вот мой плохой код 3" >> test.текст
git add -A && git commit -m "Моя фиксация 11"
echo "Вот мой плохой код 4" >> test.текст
git add -A && git commit -m "Моя фиксация 12 (v1.0.3) "
echo "Вот мой плохой код 5" >> test.текст
git add -A && git commit -m "Моя фиксация 13"
echo "Вот мой плохой код 6" >> test.текст
git add -A && git commit -m "Моя фиксация 14"
echo "Вот мой плохой код 7" >> test.текст
git add -A && git commit -m "Моя фиксация 15 (v1.0.4) "
echo "Вот мой плохой код 8" >> test.текст
git add -A && git commit -m "Моя фиксация 16"

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

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

$ git журнал
совершить 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Автор: Зак Х
Дата: 31 декабря 23:07:27 2017 -0800
Мой коммит 17
совершить 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Автор: Зак Х
Дата: 31 декабря 23:07:25 2017 -0800
Моя фиксация 16
совершить 598d4c4acaeb14cda0552b6a92aa975c436d337a
Автор: Зак Х
Дата: 31 декабря 23:07:23 2017 -0800
Моя фиксация 15 (v1.0.4)
совершить b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Автор: Зак Х
Дата: 31 декабря 23:07:21 2017 -0800
Моя фиксация 14
совершить eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Автор: Зак Х
Дата: 31 декабря 23:07:19 2017 -0800
Мой коммит 13
совершить 3cb475a4693b704793946a878007b40a1ff67cd1
Автор: Зак Х
Дата: 31 декабря 23:07:17 2017 -0800
Моя фиксация 12 (v1.0.3)
совершить 0419a38d898e28c4db69064478ecab7736700310
Автор: Зак Х
Дата: 31 декабря 23:07:15 2017 -0800
Моя фиксация 11
совершить 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Автор: Зак Х
Дата: 31 декабря 23:07:13 2017 -0800
Моя фиксация 10
совершить a33e366ad9f6004a61a468b48b36e0c0c802a815
Автор: Зак Х
Дата: 31 декабря 23:07:11 2017 -0800
Моя фиксация 9
совершить ead472d61f516067983d7e29d548fc856d6e6868
Автор: Зак Х
Дата: 31 декабря, 23:07:09 2017 -0800
Моя фиксация 8
совершить 8995d427668768af88266f1e78213506586b0157
Автор: Зак Х
Дата: 31 декабря 23:07:07 2017 -0800
Моя фиксация 7 (v1.0.2)
совершить be3b341559752e733c6392a16d6e87b5af52e701
Автор: Зак Х
Дата: 31 декабря, 23:07:05 2017 -0800
Моя фиксация 6
совершить c54b58ba8f73fb464222f30c90aa72f60b99bda9
Автор: Зак Х
Дата: 31 декабря 23:07:03 2017 -0800
Моя фиксация 5 (v1.0.1)
совершить 264267111643ef5014e92e23fd2f306a10e93a64
Автор: Зак Х
Дата: 31 декабря, 23:07:01 2017 -0800
Моя фиксация 4
совершить cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Автор: Зак Х
Дата: 31 декабря 23:06:59 2017 -0800
Моя фиксация 3
совершить 3f90793b631ddce7be509c36b0244606a2c0e8ad
Автор: Зак Х
Дата: 31 декабря 23:06:57 2017 -0800
Моя фиксация 2 (v1.0.0)
совершить cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Автор: Зак Х
Дата: 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 <- BUG INTRODUCED HERE” entered the picture.

Ситуация 1

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

$ git начало пополам

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

$ git bisect хорошо 8995d42
$ git bisect плохо

Выход:

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

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

$ cat тест.текст

Выход:

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

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

$ git bisect плохо

Выход:

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

Он перемещает наш код на фиксацию 9. Тестируем еще раз:

$ cat тест.текст

Выход:

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

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

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

$ git bisect reset

Выход:

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

Ситуация 2

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

$ git начало пополам
$ git bisect хорошо 3f90793
$ git bisect bad 3cb475a

Выход:

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

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

$ cat тест.текст

Выход:

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

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

$ git bisect хорошо

Выход:

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

Это побудило нас совершить 9. Тестируем еще раз:

$ cat тест.текст

Выход:

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

Мы снова нашли фиксацию, которая привела к ошибке. Это был коммит «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

Левая кнопка мыши не работает в Windows 10
Если вы используете выделенную мышь со своим ноутбуком или настольным компьютером, но левая кнопка мыши не работает в Windows 10/8/7 по какой-то причи...
Курсор прыгает или перемещается случайным образом при наборе текста в Windows 10
Если вы обнаружите, что ваш курсор мыши прыгает или перемещается сам по себе, автоматически, случайным образом при вводе текста на ноутбуке или компью...
Как изменить направление прокрутки мыши и сенсорной панели в Windows 10
Мышь а также Сенсорная панельs не только упрощают вычисления, но и делают их более эффективными и требуют меньше времени. Мы не можем представить себе...