Rain Lag

Стратегия «один вопрос — одна ветка»: маленькая Git‑привычка, которая помогает держать фичи маленькими и готовыми к релизу

Как правило «один вопрос на ветку» превращает ваш Git‑процесс в поток небольших, безопасных и всегда готовых к выкату изменений.

Стратегия «один вопрос — одна ветка»: маленькая Git‑привычка, которая помогает держать фичи маленькими и готовыми к релизу

Команды редко проваливаются из‑за того, что не умеют писать код. Чаще они проваливаются, потому что не умеют этот код безопасно выкатывать.

Ветки раздуваются до безумных размеров. Pull request’ы превращаются в романы. Мёрджи становятся ночными кошмарами. Все обещают себе «в следующий раз сделаю поменьше» — и снова не делают.

Эту ситуацию может изменить на удивление маленькая привычка: стратегия веток «один вопрос».

Вместо того чтобы думать в терминах «фич» или «тикетов», вы начинаете мыслить в терминах вопросов:

Каждая ветка должна отвечать ровно на один вопрос.

Из одного этого ограничения вы получаете более мелкие изменения, быстрые ревью, безопасные релизы и историю Git, которая действительно рассказывает историю развития проекта.

В этом посте разберём, как применять правило «один вопрос», держать ветки маленькими и недолгоживущими, использовать feature flags и поддерживать чистую историю Git, которая упрощает отладку и совместную работу.


Что такое стратегия «один вопрос — одна ветка»?

Обычно ветки называют примерно так:

  • feature/user-profile-page
  • bugfix/payment-timeout

Формально всё нормально, но слишком расплывчато. Реальный, осмысленный объём работы почти всегда меньше и конкретнее. Стратегия «один вопрос» заставляет эту конкретику сформулировать.

Примеры хороших веток в стиле «один вопрос»:

  • feat/can-users-edit-avatarВопрос: Могут ли пользователи редактировать свой аватар в профиле?
  • bug/fix-payment-timeout-on-slow-networkВопрос: Работает ли оплата на медленном соединении?
  • chore/add-logging-to-order-processingВопрос: Хватает ли нам логов, чтобы разбирать падения при обработке заказов?

Каждая ветка существует, чтобы ответить ровно на один конкретный вопрос или удовлетворить одну чёткую пользовательскую потребность. Если в процессе работы вы понимаете, что начали отвечать уже на второй вопрос, это сигнал:

  • либо разделить работу ещё на одну ветку;
  • либо доделать текущий вопрос, смёрджить и начать заново.

Ограничение небольшое, но последствия серьёзные:

  • Ветки естественным образом становятся меньше.
  • Работа остаётся готовой к выкату.
  • Ревью становится проще осмыслить.

Всегда начинайте с чистого, стабильного main

Стратегия «один вопрос» лучше всего работает, если вы соблюдаете базовое правило:

Никогда не разрабатывайте прямо в main. Всегда отпочковывайтесь от него.

Почему это важно:

  • main остаётся стабильным и готовым к деплою.
  • Эксперименты и рискованные изменения живут в отдельных feature‑ветках.
  • Чётко видно, что готово к продакшену, а что ещё в процессе.

Типичный сценарий:

git checkout main git pull origin main # называйте ветку по вопросу, на который она отвечает git checkout -b feat/can-users-edit-avatar

Такое разделение защищает команду: никто случайно не выкатит сырую идею, а откаты останутся простыми и предсказуемыми.


Держите ветки короткоживущими и синхронизированными

Долго живущие ветки — прямой путь к конфликтам и адскому мёрджу.

Вместо этого нацельтесь на короткоживущие feature‑ветки:

  • от нескольких часов до пары дней, но не недель;
  • маленькие вертикальные срезы ценности — ровно столько, чтобы ответить на один вопрос.

Чтобы не отстать от main, регулярно с ним синхронизируйтесь:

git checkout main git pull origin main git checkout feat/can-users-edit-avatar git rebase main # или merge, в зависимости от вашего процесса

Частая синхронизация:

  • Держит вашу ветку в актуальном состоянии относительно чужих изменений.
  • Уменьшает размер и сложность конфликтов при слиянии.
  • Гарантирует, что ваша работа всегда близка к тому, чтобы её можно было выкатить в прод.

Короткоживущие, регулярно обновляемые ветки просто не успевают обрасти клыками.


Небольшие, реально шипуемые Pull Request’ы

Вся цель веток «один вопрос» — получать маленькие, шипуемые pull request’ы (PR).

Шипуемый PR должен:

  • Отвечать на вопрос из названия ветки.
  • Быть просматриваемым за один присест (в идеале до ~400 строк эффективных изменений).
  • Иметь чёткий критерий успеха (например: «Пользователь может загрузить и обрезать аватар»).

Плюсы маленьких PR:

  • Быстрые ревью: меньше когнитивной нагрузки, проще заметить ошибки.
  • Лучшее качество: ревьюер понимает замысел и видит архитектурные проблемы.
  • Безопасные релизы: откат касается небольшого, хорошо очерченного изменения.

Если в описании PR вам приходится несколько раз использовать слово «и» —

«Реализует загрузку аватара и перестроение профиля и рефакторит авторизацию»

— вероятнее всего, вы решаете уже больше одного вопроса.


Используйте feature flags, чтобы мёрджить раньше и чаще

Иногда на ответ на ваш вопрос уходит больше одного дня — или, например, backend уже готов, а UI ещё нет.

Но вы всё равно хотите держать ветки маленькими и часто мёрджить. Здесь и выручают feature flags (фича‑флаги, флажки, toggles).

Feature flags:

  • Позволяют мёрджить незавершённую работу в main.
  • Держат рискованное поведение выключенным в продакшене, пока оно не готово.
  • Помогают строить trunk‑based или trunk‑friendly разработку, не ломая пользователям продукт.

Примерный паттерн:

// псевдокод if (isFeatureEnabled('user-avatar-edit')) { showAvatarEditUI(); }

С флагами вы можете:

  • Собрать backend в одной ветке.
  • Добавить UI в другой.
  • Свести всё вместе в третьей.

Каждая ветка отвечает на один вопрос, всё мёрджится в main за флагом. Когда всё готово — вы просто включаете флаг.

Так ветки остаются короткоживущими, а mainпостоянно готовым к релизу.


Коммитьте часто, но пусть каждый коммит рассказывает историю

Ветка рассказывает историю на высоком уровне («Могут ли пользователи редактировать аватары?»).

Коммиты рассказывают историю по главам — как вы к этому пришли.

Два простых правила:

  1. Коммитьте часто. Не ждите идеала.
  2. Пишите понятные, осмысленные сообщения к коммитам, описывающие прежде всего зачем, а не только что.

Плохие сообщения к коммитам:

  • fix stuff
  • wip
  • changes

Лучшие варианты:

  • Add Avatar model field to store uploaded image path
  • Validate image size and type before saving avatar
  • Show avatar preview and error messages in profile form

Если кто‑то будет разбираться с багом через полгода, ваши коммиты должны помогать ответить на вопросы:

  • Зачем это изменение вообще было сделано?
  • Какую проблему пытался решить этот коммит?

Ветка «один вопрос» даёт контекст. Хорошие коммиты дают детали.


Поддерживайте чистую, понятную историю Git

Чистая история — это не про эстетику. Это про отладку и совместную работу.

Последовательные правила именования веток и работы с мёрджами помогают:

  • Отслеживать, когда и почему изменилось поведение системы.
  • Эффективно использовать git bisect для поиска регрессий.
  • Быстрее вводить в курс дела новых членов команды.

Несколько практических привычек:

  1. Используйте единообразные префиксы для веток.

    • feat/... для фич
    • bug/... для багфиксов
    • chore/... для нефункциональных задач
  2. Избегайте огромных merge‑коммитов.

    • Синхронизируйтесь рано и часто, чтобы мёрджи были маленькими.
    • Используйте rebase (если команда с этим согласна), чтобы держать историю линейной и читаемой.
  3. Squash, когда это уместно.

    • Сквошьте шумные, экспериментальные коммиты в один осмысленный блок, когда ветка готова.
    • В идеале — один коммит на один отвеченный вопрос или небольшой связный набор коммитов.
  4. Связывайте ветки и коммиты с задачами или тикетами.

    • Упоминайте ID задач в названиях веток или в сообщениях коммитов.
    • Пример: feat/1234-can-users-edit-avatar.

В результате git log читается как понятный рассказ о том, чему и когда «научилась» ваша система.


Всё вместе: пример рабочего процесса «один вопрос — одна ветка»

Вот как может выглядеть типичный рабочий день по стратегии «один вопрос»:

  1. Начните с вопроса.
    «Могут ли пользователи загружать и редактировать свой аватар профиля?»

  2. Создайте ветку от main.
    git checkout -b feat/can-users-edit-avatar

  3. Реализуйте задачу небольшими, связанными коммитами.
    Каждый коммит чуть‑чуть приближает вас к ответу на вопрос.

  4. Регулярно синхронизируйтесь с main.
    Rebase или merge, чтобы не отставать.

  5. Используйте feature flag, если фича ещё не готова полностью.
    Смёрджьте backend или часть UI за флагом user-avatar-edit.

  6. Откройте маленький, сфокусированный PR.
    В описании: на какой вопрос отвечает ветка, как именно и как это проверить.

  7. Выкатите и почистите.
    После merge удалите ветку. Включите feature flag, когда всё готово.

Повторяйте то же самое для следующего вопроса.


Итог: по одному вопросу за раз

Вам не нужен сложный «ритуал Git», чтобы улучшить рабочий процесс. Нужны последовательность и понятные ограничения.

Стратегия веток «один вопрос» даёт и то, и другое:

  • Один вопрос на ветку удерживает скоуп узким и сфокусированным.
  • Короткоживущие, часто синхронизируемые ветки предотвращают кошмары с мёрджами.
  • Маленькие, шипуемые PR’ы ускоряют ревью и снижают риски.
  • Feature flags позволяют мёрджить изменения рано, не показывая незавершённую работу пользователям.
  • Понятные коммиты и стабильный процесс создают историю Git, которой можно доверять.

Примите эту небольшую привычку — и работа команды перестанет быть клубком недоделанных фич. Вместо этого вы получите поток маленьких, безопасных и легко выкатываемых ответов — по одному вопросу за раз.

Стратегия «один вопрос — одна ветка»: маленькая Git‑привычка, которая помогает держать фичи маленькими и готовыми к релизу | Rain Lag