>_ IzzyLab

Практическое задание

Найди первый плохой коммит

сложно

В /root/repo линейная история из восьми коммитов (c0c7). В каждом коммите перезаписывается файл app.txt. На каком-то коммите в app.txt появился маркер bug и остался во всех последующих коммитах — то есть все ранние коммиты «хорошие», а начиная с какого-то — «плохие».

Найди первый плохой коммит (тот, где bug появился впервые) и запиши его полный хеш в файл /root/answer.txt (одной строкой). Самый первый коммит c0 заведомо хороший, а вершина ветки — заведомо плохая.

Что потренируешь:
  • git bisect
  • поиск регрессии
  • бинарный поиск
  • git rev-parse
  • хеши коммитов

Разбор темы

Когда дефект «залез» в историю на неизвестном коммите, перебирать десятки ревизий вручную неэффективно — правильнее свести число проверок к логарифму. В git для этого есть встроенный механизм двоичного поиска по диапазону между заведомо хорошей и заведомо плохой границей: на каждом шаге он выдаёт коммит из середины, ты сообщаешь ему вердикт (хороший/плохой), и он вдвое сужает интервал. Проверку можно и автоматизировать скриптом-предикатом, чтобы git сам прогнал весь диапазон. Полный хеш нужного коммита достаётся через git rev-parse.

Что проверяется

  1. в answer.txt записан валидный хеш коммита
  2. это именно первый плохой коммит

Как это выглядит