Как найти коммит "после чего поломалось"

Не многие знают, что у системы контроля версий git есть механизм поиска коммита “который сломал”. Называется он - bisect.

Чтобы начать его использовать, нужно выполнить три команды: запустить сам bisect, указать известный нам хороший коммит(тот в котором ошибки еще небыло) и указать что текущий коммит плохой(содержит ошибку).

$ git bisect start
$ git bisect good XXXXXX
$ git bisect bad

Git каждый раз будет переключаться на “средний” из списка коммитов, которые находятся между “bad” коммитом и “good” коммитом. Проверив наличие ошибки, вы указываете, каким является текущий коммит (“хороший” или “плохой”) и в зависимости от этого git переключается на коммит ниже текущего или выше. И таким образом, git, будет двигаться пока не найдет первый коммит “который сломал”.

Автоматизировать такие действия пользователя, как маркировка коммита “плохим” или “хорошим”, поможет тест. Потому что Bisect может сам проделывать все это, опираясь на результат скрипта переданного ему. То есть мы можем написать тест и передать команду запуска этого теста в bisect, который будет переключаться между коммитами, запускать тест и проверять его код возврата.

Вот здесь есть пример репозитория для того, чтоб поиграться с bisect’ом. В корне есть два файла: code.py с тестируемым кодом и test.py с тестом (для тех, кто дочитал до сюда, скажу, что еще есть каталог “friday_18+” в котором все тоже само,е но пятничное, тоесть 18+)) ).

В общем, как воспользоваться:

Сначала клонируем себе репозиторий и переходим в склонированный каталог

$ git clone https://github.com/Quard/test-git-bisect
$ cd test-git-bisect

Инициируем bisect и задаем начальные хороший и плохой коммиты

$ git bisect start
$ git bisect bad
$ git bisect good d8e32db15267e857dda146d6a131a1289e91da74

После нам остается только запустить автоматическое нахождение “рокового” коммита

$ git bisect run python test.py

для версии 18+:

$ git bisect run python friday_18+/test.py

В ответ на это, нам выведется тот саммый коммит, в котром впервые поломался тест.

fd8c657e5d7815c3a40300775052a53154f23c35 is the first bad commit
commit fd8c657e5d7815c3a40300775052a53154f23c35
Author: Vadym Zakovinko <vadym@zakovinko.com>
Date:   Thu Feb 6 23:37:48 2014 +0200

    first commit where test not passed

:100644 100644 7f8c76386744a9c61b4d81711e19f9baa40da085 6f4bad0dd434a1be374f22556426b77298e84199 M  code.py
:040000 040000 6535863c894d9e4c2f3498c17308441b15423b93 ddc01723d68e0913094c9b004859bcc42e1730fd M  friday_18+
bisect run success

репозиторий: https://github.com/Quard/test-git-bisect

для версии 18+ необходим OpenCV