Алгоритм решения задачи и багфикса: полный цикл и ветвление в Git

Хаос в разработке начинается не в коде, а в голове: непонятно, с чего начать, от какой ветки ответвляться и можно ли катить правку сразу на прод. Ниже — спокойный, повторяемый алгоритм. Он одинаково работает и для новой фичи, и для рутинного бага, и для «горящего» инцидента на проде. Идея простая: сначала понять задачу, потом выбрать тип работы, и только потом трогать код.

Шаг 0. Понять задачу (до единой строки кода)

Самая дорогая ошибка — начать писать код, не поняв проблему. Прежде чем открывать редактор, ответьте себе на вопросы:

  • Что именно нужно? Сформулируйте задачу одним предложением. Если не получается — задача ещё не понята.
  • Как я пойму, что готово? Критерии приёмки: что должно работать, какой результат считается верным.
  • Где это в коде? Найдите место (файл, функцию, модуль), которое нужно менять. Поиск по проекту экономит часы.
  • Что может сломаться рядом? Какие части системы зависят от этого кода.

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

1. Что сделал пользователь (шаги).
2. Что он ожидал увидеть.
3. Что увидел на самом деле (ошибка, лог, скриншот).
4. Где воспроизводится: прод / тест / только локально.

Шаг 1. Определить тип работы

От типа работы зависит всё: от какой ветки ответвляться, насколько тщательно тестировать и как быстро катить. Различают три основных типа.

Фича (feature) — новая функциональность

Новый раздел, форма, кнопка, интеграция. Не срочно, можно делать спокойно и с ревью. Ответвляется от ветки разработки (dev или main, если модель простая).

Фикс (fix) — обычное исправление бага

Что-то работает не так, но мир не рушится: кривая вёрстка, неверный текст, ошибка в редком сценарии. Идёт тем же путём, что и фича — через ветку разработки и обычный релиз.

Хотфикс (hotfix) — срочная правка прода

На проде сломалось что-то важное прямо сейчас: упала оплата, белый экран, утечка данных. Ждать следующего релиза нельзя. Хотфикс ответвляется от продакшен-ветки (main/master), а не от dev — потому что в dev уже лежат недоделанные фичи, которые на прод выкатывать нельзя.

Главный критерий хотфикса — «горит на проде». Если не горит, это обычный фикс, и спешка только добавит новых багов.

Шаг 2. Блок-схема: куда ветвиться

Чтобы не гадать каждый раз, прогоните задачу через простую схему принятия решения:

                  ┌─────────────────────────────┐
                  │   Появилась задача / баг      │
                  └──────────────┬──────────────┘
                                 │
                 ┌───────────────▼────────────────┐
                 │ Прод сломан и ждать нельзя?     │
                 └───────┬───────────────┬────────┘
                    да   │               │  нет
                         ▼               ▼
              ┌──────────────────┐   ┌─────────────────────────┐
              │  HOTFIX          │   │ Это новый функционал?    │
              │  ветка от main   │   └──────┬──────────────┬───┘
              └────────┬─────────┘     да   │              │ нет
                       │                    ▼              ▼
                       │            ┌──────────────┐  ┌──────────────┐
                       │            │ FEATURE      │  │ FIX (баг)    │
                       │            │ ветка от dev │  │ ветка от dev │
                       │            └──────┬───────┘  └──────┬───────┘
                       │                   │                 │
                       ▼                   ▼                 ▼
              ┌────────────────┐   ┌────────────────────────────────┐
              │ merge → main   │   │ merge → dev → тест → релиз→main │
              │ + обратно в dev│   └────────────────────────────────┘
              └────────────────┘

Ключевой нюанс хотфикса: после выката на прод его обязательно нужно влить обратно в dev, иначе в следующем релизе починенный баг «вернётся» — ведь в ветке разработки правки не было.

Шаг 3. Полный цикл работы над задачей

Когда тип определён, дальше всё идёт по одному и тому же конвейеру. Разница между фичей, фиксом и хотфиксом — только в исходной ветке и в скорости, но не в этапах.

3.1. Создать ветку с понятным именем

Одна задача — одна ветка. Имя ветки говорит, что внутри:

# Новый функционал — от ветки разработки
git switch dev
git pull
git switch -c feature/user-profile-export

# Обычный баг — тоже от dev
git switch -c fix/cart-total-rounding

# Срочная правка прода — ОТ ПРОДАКШЕН-ВЕТКИ
git switch main
git pull
git switch -c hotfix/payment-500-error

Префиксы feature/, fix/, hotfix/ сразу показывают тип и происхождение ветки — это удобно и людям, и автоматике (CI).

3.2. Писать код маленькими шагами

  • Сначала минимально рабочее решение, потом улучшения. Не пытайтесь сделать идеально с первого захода.
  • Меняйте только то, что относится к задаче. Заметили другой баг — заведите отдельную задачу/ветку, не тащите в текущую.
  • Коммитьте часто и осмысленно. Маленький коммит легко понять и при необходимости откатить.
git add .
git commit -m "fix(cart): round total to 2 decimals"

Для бага есть отдельный приём — сначала зафиксировать причину, потом чинить. Полезно временно добавить тест или лог, который воспроизводит баг: увидели, что он падает «как надо», — теперь чините, пока не станет зелёным.

3.3. Проверить у себя (до ревью)

Самопроверка экономит время всем. Минимум перед тем, как показывать код:

  • сценарий из задачи действительно работает;
  • тот самый баг больше не воспроизводится по исходным шагам;
  • ничего соседнего не сломалось (прогон тестов / сборки);
  • в диффе нет случайного мусора: отладочных console.log, закомментированного кода, лишних файлов.
git diff            # перечитать собственные изменения свежим взглядом
npm test            # прогнать тесты, если они есть
npm run build       # убедиться, что проект собирается

3.4. Pull Request и ревью

Залейте ветку и откройте Pull Request в целевую ветку (dev для фич/фиксов, main для хотфиксов). Хорошее описание PR отвечает на три вопроса: что поменялось, зачем и как проверить.

git push -u origin feature/user-profile-export

Ревьюер смотрит не «нравится/не нравится», а: решает ли код задачу, нет ли очевидных багов, не усложнено ли без нужды. После замечаний — правки в той же ветке, новые коммиты, повторный взгляд.

3.5. Мерж и выкат

После аппрува — мерж. Дальше путь зависит от типа:

  • Фича/фикс: мерж в dev → проверка на тест-стенде → когда накопился релиз, dev вливается в main и катится на прод.
  • Хотфикс: мерж в main → немедленный выкат на прод → обратный мерж в dev, чтобы правка не потерялась.

3.6. Проверить на проде и закрыть задачу

Выкатили — убедитесь, что на реальном проде всё работает (особенно после хотфикса). Не забудьте про кэш: иногда «не помогло» означает лишь старый закэшированный ассет или страницу. После проверки — закрыть задачу и кратко записать, в чём была причина: будущему себе спасибо.

Отдельно про хотфикс: дисциплина под давлением

Инцидент на проде провоцирует панику и «быстрые» правки прямо на сервере. Это и есть источник новых аварий. Спокойный порядок действий:

  1. Стабилизировать, потом разбираться. Если есть способ быстро вернуть работоспособность (откат на прошлую версию, фича-флаг, отключение проблемного блока) — сделайте это первым. Откат часто быстрее и безопаснее «героического» фикса.
  2. Минимальная правка. Хотфикс чинит ровно одну проблему. Рефакторинг и улучшения — потом, отдельной задачей.
  3. Через ветку и git, а не правкой файлов на сервере. Иначе изменение нигде не сохранится и потеряется при следующем деплое.
  4. Обратный мерж в dev. Обязательно — иначе баг вернётся.
  5. Постмортем. Когда пожар потушен — короткий разбор: почему случилось и что сделать, чтобы не повторилось.

Чек-лист на каждый день

[ ] Понял задачу и критерии готовности
[ ] (баг) Воспроизвёл и зафиксировал шаги
[ ] Определил тип: feature / fix / hotfix
[ ] Ответвился от правильной ветки (dev или main)
[ ] Сделал маленькие осмысленные коммиты
[ ] Проверил у себя: работает, не сломал соседнее, дифф чистый
[ ] Открыл PR с описанием «что / зачем / как проверить»
[ ] Прошёл ревью и внёс правки
[ ] Смёрджил и выкатил
[ ] Проверил на проде (+ сбросил кэш при необходимости)
[ ] (hotfix) Влил обратно в dev
[ ] Закрыл задачу и записал причину

Итог

Хороший разработчик отличается не скоростью набора, а порядком в голове. Алгоритм один: понять → классифицировать → ответвиться правильно → сделать малыми шагами → проверить → провести через ревью → выкатить → подтвердить на проде. Разница между фичей, обычным фиксом и хотфиксом — лишь в исходной ветке и в срочности. Запомните главное правило ветвления: фичи и фиксы растут от ветки разработки, хотфиксы — от прода и обязательно возвращаются в разработку. Когда этот цикл становится привычкой, задачи перестают пугать, а прод — падать от случайных правок.