Rain Lag

Пауза перед коммитом: 90‑секундный ритуал, который останавливает грязный код до того, как он попадёт в Git

Как простой 90‑секундный ритуал перед коммитом, в сочетании с небольшими атомарными коммитами и автоматическими pre-commit‑проверками, может радикально повысить качество кода команды и чистоту истории в Git.

Пауза перед коммитом: 90‑секундный ритуал, который останавливает грязный код до того, как он попадёт в Git

Современная разработка идёт очень быстро. Фича-брanches, pull requests, continuous deployment — всё заточено под то, чтобы как можно быстрее выкатывать код. Но скорость без дисциплины почти неизбежно приводит к хаосу: захламлённая история коммитов, сломанные тесты в main, «быстрые фиксы», которые заканчиваются инцидентами в проде.

Одна маленькая привычка может заметно уменьшить этот хаос: пауза перед коммитом.

Это простой 90‑секундный ритуал, который вы выполняете перед каждым git commit. Вы останавливаетесь, просматриваете и проверяете свои изменения — опираясь на короткий чек-лист и автоматические инструменты — чтобы сломанный или неаккуратный код вообще не попал в репозиторий.

Речь не о том, чтобы вас замедлить. Речь о том, чтобы каждый коммит имел значение.


Что такое пауза перед коммитом?

Пауза перед коммитом — это осознанный короткий ритуал (около 90 секунд) прямо перед тем, как вы запускаете git commit. В эту паузу вы:

  1. Просматриваете, что именно собираетесь закоммитить
  2. Пробегаете быстрый ментальный (или записанный) чек-лист
  3. Опционально запускаете проверки вручную или позволяете pre-commit‑хуку сделать это за вас
  4. Убеждаетесь, что коммит небольшой, атомарный и понятно описан

Цель — не глубокий code review. Это sanity check: безопасен ли этот коммит, достаточно ли он сфокусирован и будет ли понятен тому, кто прочитает его позже (включая будущего вас)?

Если совместить эту привычку с pre-commit‑чек-листами и Git pre-commit‑хуками, которые запускают форматирование, линтеры и тесты, вы получаете лёгкий фильтр качества ещё до того, как изменения попадут в общий репозиторий.


Зачем вообще заморачиваться? Цена пропуска паузы

Кажется, что пропустить этот шаг — мелочь. Пока не посмотрите шире:

  • Вы пушите коммит, в котором случайно остались отладочные логи, закомментированные куски или недоделанный код.
  • Тривиальная ошибка форматирования или линтера роняет CI и блокирует всю команду.
  • Тесты начинают падать только после того, как код попал в общую ветку, и всё заканчивается шумными откатами и хотфикcами.
  • Ваша история коммитов превращается в кладбище сообщений вроде fix, oops, really fix, wip, final final actually working.

Каждая из этих проблем по отдельности не страшна, но вместе они тормозят команду и подрывают доверие к кодовой базе.

Пауза перед коммитом — это маленькая, но системная защита от всего этого бардака.


Принцип №1: Небольшие атомарные коммиты

Пауза перед коммитом начинается с одного простого вопроса:

«Является ли этот коммит одним логическим изменением?»

Атомарный коммит делает ровно одну вещь:

  • Добавляет новую функцию
  • Чинит конкретный баг
  • Рефакторит модуль
  • Обновляет зависимости

Чего он не делает:

  • Не чинит баг, параллельно рефакторя несвязанный код и обновляя документацию
  • Не смешивает изменения форматирования с изменением поведения
  • Не тащит за собой «раз уж зашёл» чистки из случайных уголков кодовой базы

Почему атомарность важна

  • Проще ревьюить: легче рассуждать об одном изменении за раз.
  • Проще дебажить: git bisect и blame полезнее, когда каждый коммит сосредоточен на одном.
  • Безопаснее откатывать: можно откатить один коммит без побочных эффектов.

Короткий чек-лист на атомарность

Перед коммитом спросите себя:

  • Могу ли я описать это изменение одним предложением, без слов «и», «а также»?
  • Если этот коммит откатить, останется ли кодовая база в консистентном состоянии?
  • Не проскочили ли сюда несвязанные правки (случайные переименования, только форматирование и т.п.)?

Если ответы не радуют — разбейте изменения на несколько меньших коммитов.


Принцип №2: Сообщения коммитов должны объяснять зачем, а не только что

Большинство сообщений к коммитам слишком размыты и мало полезны:

  • update code
  • fix bug
  • changes

Они говорят, что что‑то изменилось, но не объясняют, зачем.

Будущим читателям (включая вас) нужен контекст. Они будут спрашивать:

  • Какую проблему это решало?
  • Почему выбран именно такой подход?
  • Это поведение — осознанное или случайное?

Более удачная формула сообщения коммита

Считайте сообщение к коммиту коротким рассказом про маленькое изменение.

Простой шаблон:

<краткое резюме в повелительном наклонении> Опциональное тело, в котором указано: - Причина изменения (то самое «зачем») - Компромиссы и подводные камни - Ссылки на задачи/тикеты, если нужно

Примеры:

Исправить некорректный расчёт налога для заказов со скидкой Раньше налог считался с полной цены до применения скидки, что приводило к завышенным суммам. Теперь налог считается после скидок, в соответствии с нашей документацией и юридическими требованиями.
Рефакторинг сервиса пользователей для отделения от ORM-моделей Добавлен слой репозиториев, изолирующий логику сохранения. Это упростит переход на нового поставщика БД в следующем квартале.

Во время паузы перед коммитом спросите себя:

  • Пойму ли я через год, только по этому сообщению и диффу, о чём был коммит?

Если нет — потратьте лишние 20–30 секунд на улучшение сообщения. Это окупится многократно.


Принцип №3: Pre-commit‑чек-лист (ручной + автоматический)

Pre-commit‑чек-лист превращает ваш 90‑секундный ритуал в устойчивую привычку. Его можно держать в голове, на стикере, в редакторе или в документации.

Пример ручного чек-листа (человеческие проверки)

Перед коммитом быстро:

  1. Просмотрите diff:
    • Нет ли отладочных print/логов, TODO, закомментированных блоков, которые не должны идти в коммит?
    • Нет ли в индексе файлов, которые вы не собирались коммитить (например, .env, временные скрипты)?
  2. Проверьте границы изменения:
    • Ограничен ли коммит одним логическим изменением?
    • Избежали ли вы смешения рефакторинга и изменения поведения?
  3. Проверьте поведение:
    • Запускали ли вы релевантные тесты или хотя бы сделали локальный smoke‑test?
    • Собирается ли код и запускается ли он в вашей среде?
  4. Документируйте при необходимости:
    • Появилось ли новое поведение, которое стоит задокументировать или отметить в changelog?
  5. Напишите/проверьте сообщение коммита:
    • Объясняет ли оно ясно, зачем сделано изменение?

Даже такой быстрый пробег ловит удивительно много моментов из серии «ой».

Автоматизация чек-листа с помощью Git pre-commit‑хуков

Совсем не обязательно всё делать руками. Git pre-commit‑хуки могут автоматически:

  • Запускать линтеры (например, flake8, eslint)
  • Применять форматтеры (например, black, prettier)
  • Проверять сортировку импортов (например, isort)
  • Гонять небольшой, быстрый поднабор тестов
  • Блокировать коммиты, нарушающие базовые правила (секреты в коде, падающие линтеры и т.п.)

Здесь особенно полезны такие инструменты, как pre-commit.


Принцип №4: Использование pre-commit и pre-commit.ci

pre-commit — это фреймворк для управления и запуска pre-commit‑хуков на разных языках, не только на Python.

Как это работает (в общих чертах)

  1. Вы создаёте в репозитории файл .pre-commit-config.yaml со списком хуков.
  2. Разработчики ставят pre-commit локально и один раз выполняют pre-commit install.
  3. pre-commit автоматически запускает настроенные хуки на файлах, которые вы собираетесь закоммитить.

Пример конфига pre-commit для Python‑проекта:

repos: - repo: https://github.com/psf/black rev: 24.4.2 hooks: - id: black - repo: https://github.com/pycqa/flake8 rev: 7.1.0 hooks: - id: flake8 - repo: https://github.com/pre-commit/mirrors-prettier rev: v4.0.0-alpha.8 hooks: - id: prettier files: '\\.(js|ts|jsx|tsx|json)$'

С этим конфигом каждый коммит автоматически:

  • Форматирует Python‑код с помощью black
  • Линтит Python при помощи flake8
  • Форматирует JavaScript/TypeScript/JSON с помощью prettier

Если какой‑то хук падает, коммит блокируется, пока вы не исправите проблемы.

pre-commit.ci: проверки в облаке

pre-commit.ci — это облачный сервис, который:

  • Запускает ваши pre-commit‑хуки в CI для каждого pull request
  • Автоматически исправляет часть проблем и пушит изменения обратно в ветку, когда это возможно
  • Обеспечивает единообразные проверки даже для тех контрибьюторов, у кого хуки локально не установлены

Эта связка — локальные хуки pre-commit плюс pre-commit.ci — создаёт устойчивую систему защиты:

  • Вы ловите проблемы до коммита во время своей паузы.
  • Сервис ловит всё, что проскочило, или что пришло от внешних участников.

Как это выглядит целиком: 90‑секундный флоу

Так может выглядеть реальная пауза перед коммитом на практике:

  1. Добавьте изменения в индекс

    git add <files>
  2. Просмотрите diff (30–40 секунд)

    git diff --cached
    • Уберите случайные отладочные принты или закомментированный код
    • Уберите из индекса несвязанные изменения при необходимости
  3. Проверьте поведение (20–30 секунд)

    • Запустите небольшой релевантный набор тестов или быстро проверьте функциональность, которую меняли
  4. Дайте pre-commit отработать (автоматически, часто за 30 секунд и меньше)

    git commit
    • Хуки отформатируют и пролинтят код
    • Если что‑то упало — следуйте подсказкам, исправьте, перезапустите
  5. Напишите понятное сообщение коммита (10–20 секунд)

    • Одна строка‑резюме + по желанию короткое объяснение «почему»

Общее время: примерно 90 секунд. Часто — меньше.

В обмен вы получаете:

  • Более чистую историю коммитов
  • Меньше упавших сборок
  • Больше уверенности при мерджах и выкладках

Вывод: дисциплина маленькими дозами по 90 секунд

Качество кода — это не только про сложные алгоритмы и модные архитектуры. Это про маленькие, но регулярные привычки. Пауза перед коммитом — одна из самых простых и при этом самых эффективных привычек, которые вы можете внедрить:

  • Останавливайтесь примерно на 90 секунд перед каждым коммитом.
  • Делайте коммиты небольшими и атомарными — по одному логическому изменению.
  • Пишите сообщения коммитов, объясняющие «почему», а не только «что изменилось».
  • Используйте pre-commit‑чек-лист и автоматические хуки, чтобы ловить проблемы заранее.
  • Подключайте инструменты вроде pre-commit и pre-commit.ci, чтобы сделать этот процесс почти незаметным для всей команды.

Вам не нужен громоздкий процесс, чтобы улучшить качество кода. Вам нужен маленький, но надёжный ритуал, который повторяется десятки раз в день.

Начните со следующего коммита. Потратьте 90 секунд. Остановитесь. Проверьте. Закоммитьте осознанно.

Ваше будущее «я» и ваши коллеги скажут спасибо, когда будут читать историю в Git.

Пауза перед коммитом: 90‑секундный ритуал, который останавливает грязный код до того, как он попадёт в Git | Rain Lag