Клёвый бинарный поиск в git

Хочу рассказать об одной классной фишке гита, о которой не все знают. О бинарном поиске “ломающего” коммита по истории - git bisect

Для начала запустим поиск и обозначим, что текущий коммит сломан:

git bisect start 
git bisect bad

Далее найдем последний работающий коммит и сообщим о нем гиту:

git checkout 45kj43h454h // some commit SHA
git bisect good

или так: git bisect good HEAD~25
или все вышеперечисленное одной строчкой: 
git bisect start HEAD HEAD~25

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

# if everything work good
git bisect good
# if bug is here
git bisect bad

После завершения поиска, не забудьте вернуться в исходное состояние:

git bisect reset

P.S. Ниндзя могут предпочесть такой способ:

git bisect start HEAD HEAD~25
git bisect run test_error_script
# script should return:
# 0 if bad
# 125 if skip
# 1 - 127 if good
# any other to abort bisect process

Больше возможностей (визуализация, пропуск коммитов…) ищите в документации.

P.P.S. Как это работает?

Бинарный поиск — это алгоритм поиска элемента в отсортированном массиве, использующий дробление массива на половины. - Википедия

В нашем примере гит видит, что существуют 24 коммита между последним “хорошим”, и текущим “плохим”, и предлагает нам один из середины:

git bisect start HEAD HEAD~25
Bisecting: 12 revisions left to test after this (roughly 4 steps)
[db1ea0125ae84d709d691264f40c460234a5253d] fix push-notifications

На следующей итерации останется 6, потом 3… Таким образом мы можем легко и быстро найти регрессию. Прекрасно! Спасибо гит!

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.