- PVSM.RU - https://www.pvsm.ru -
Однажды старший программист Антон, попивая кофе и вспоминая уволенного в предыдущей статье Васю [1], просматривал очередной тикет в багтрекере. В тикете было сказано, что одна из программ [2] в очень важном проекте стала при некоторых условиях возвращать «BAD» вместо «GOOD». Недолго думая, Антон написал тестовый скрипт и приступил к поиску причины такого поведения.
#!/bin/bash
result=`./project.sh`
echo $result
if [[ "$result" == "GOOD" ]]
then
echo "Test passed"
exit 0
elif [[ "$result" == "BAD" ]]
then
echo "Test failed"
exit 1
else
echo "Can not apply test"
exit 125
fi
git bisect start
./testscript.sh
git bisect bad
./testscript.sh
git bisect good
…
В компании использовали rebase, история коммитов была линейной, и поиск по ней доставлял Антону одно удовольствие.
Как вдруг:
— Хм… Проект не компилируется, тест прогнать не получится. Ну ладно, не беда, пропустим: git bisect skip.
— Что за ерунда? Опять не компилируется. Опять пропустим…
— Опять??? Какой @#$%^
запушил столько битых коммитов?
Через некоторое время перед Антоном открылась безрадостная картина: 30 коммитов, на которых проект не собирается, и где-то среди них коммит с ошибкой.
Антон набрал номер Васи.
Антон: — Привет, Василий! Подскажи, откуда в репозитории 30 ревизий, на которых проект не собирается?
Вася: — А… Помню-помню. Я разрабатывал важную фичу в своей ветке, получилось 30 коммитов, каждый — одно цельное изменение, перед коммитами прогонял все тесты, всё как по учебнику. Но в это время Петя в мастере сильно изменил API, который использовался в моих коммитах. Поэтому когда я локально сделал rebase, мои коммиты оказались после Петиного, и проект на них собираться перестал.
Антон: — И что, ты не проверил это, перед тем, как пушить?
Вася: — Конечно, проверил. И создал коммит с переходом моей фичи на новое API, после чего проект снова стал собираться.
Антон: — И как же мне теперь локализовывать ошибку в этих 30 коммитах?
Вася: — Извини, Антон. Я уволен, и теперь это не моя проблема.
Антон приступил к поиску причины бага в очень важном проекте. В компании используют merge, история коммитов нелинейна, ручной поиск по истории не доставляет Антону радости, поэтому он делегирует это дело git-bisect [3], используя заранее подготовленный скрипт.
git bisect run ./testscript.sh
Git bisect весело побежал по коммитам, автоматически запуская тестовый скрипт и расставляя метки good/bad, пропустил единственный нерабочий коммит и выдал результат.
f35d44060c4f2ae251046c0c20ae1e1f68044812 is the first bad commit
Антон: — Эй, Василий! У тебя в коммите f35d440 ошибка.
Вася: — Хорошо, посмотрю.
Через 5 минут:
Вася: — Готово, исправил.
Антон: ОК.
Мораль: любой rebase (в том числе локальный) меняет контекст, в котором были написаны коммиты, и в истории могут остаться «битые» ревизии. Помните об этом.
Пример проекта на github [4].
Автор: Yan169
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/git/34339
Ссылки в тексте:
[1] уволенного в предыдущей статье Васю: http://habrahabr.ru/post/179123/
[2] одна из программ: https://github.com/rabovik/RebaseVSMergeExample2/blob/fe79a3c434d74d900dc3af54e5602f7e70c1fa90/project.sh
[3] git-bisect: https://www.kernel.org/pub/software/scm/git/docs/git-bisect.html
[4] github: https://github.com/rabovik/RebaseVSMergeExample2
[5] Источник: http://habrahabr.ru/post/179673/
Нажмите здесь для печати.