Советы PHP-разработчика

Блог содержащий короткие заметки касающиеся программирования для web.

Git. Как найти коммит который все сломал?

Git. Как найти коммит который все сломал?

Возникали ли у вас паника, когда после git pull-а все напрочь ломается и ничего не работает или работает, но не все? В этом случае можно искать "коммит-киллер" разными способами. Например, постепенно откатывая HEAD, но я расскажу более прогрессивный метод.

Итак, речь пойдет о команде git bisect. Она не раз спасала меня от провала и экономила приличное количество времени при поиске ошибки. Работает она достаточно просто. Думаю, многие слышали про метод половинного деления (или дихотомии) и именно по такому принципу она и работает.

Мы указываем коммит при котором воспроизводится ошибка (обычно это текущее состояние) и коммит при котором все работает. Далее происходит checkout к коммиту между этими состояниями. Наша задача проверить работоспособность и известить git bisect о результате (все хорошо или все по-прежнему плохо). И так до тех пор пока не закончится поиск. В конце концов мы получаем коммит, после которого обнаружилась ошибка. Остается только посмотреть все изменения и исправить код в нужных местах.

Теперь к практике. Допустим мы работали с проектом, который помечен тегом 1.3.7 (тут все работает) и спулили последние изменения с сервера (обнаружилась ошибка). Наша последовательность действий такова:

  1. git bisect start - начинаем поиск
  2. git bisect bad - помечаем текущий HEAD, как "испорченный"
  3. git bisect good 1.3.7 - указываем рабочий коммит
  4. проверяем работоспособность
  5. вызываем git bisect good, если все работает или git bisect bad, если ошибка еще присутствует
  6. повторяем шаги 4 и 5 пока не дойдем до состояния, которое порождает ошибку
  7. смотрим список изменений и ищем причину ошибки
  8. возвращаем HEAD в первоначальное состояние с помощью git bisect reset
  9. исправляем ошибку

В git bisect good и git bisect bad можно передать тег или хэш коммита, если этого не сделать, то туда подставится текущее состояние.

Если коммитов очень много и можно написать скрипт проверки, то можно использовать команду git bisect run test-script.sh. Данный скрипт должен возвращать 0, если проверка прошла и "что угодно" в противном случае.

  • 2016-02-17 18:13:41