Олег Марков
Ветка разработки develop - полный разбор для командной работы
Введение
Ветка develop часто становится центральным элементом рабочего процесса в командах, которые используют Git Flow или похожие модели ветвления. Она служит основным местом, где аккумулируются все изменения, предназначенные для следующего релиза, и где разработчики чаще всего синхронизируют свою работу.
Задача этой статьи — подробно разобрать, зачем нужна ветка develop, как выстраивать вокруг нее рабочий процесс, какие правила стоит ввести в команде и как организовать работу с фичами, багфиксами, релизами и горячими исправлениями. Смотрите, я покажу вам, как это работает на практике, с примерами команд, типовых сценариев и рекомендаций по организации командной работы.
Основные принципы ветки develop
Что такое ветка develop в контексте Git Flow
В классической модели Git Flow есть две основные долгоживущие ветки:
main(илиmaster) — отражает состояние кода в продакшенеdevelop— отражает текущее состояние кода для следующего релиза
Схематично это выглядит так:
- Все фичи разрабатываются в отдельных ветках от
develop - После завершения фичи она вливается обратно в
develop - Когда набор фич готов к релизу — из
developсоздается ветка релиза или выполняется слияние вmain - Критические исправления продакшена идут из
mainв отдельную ветку hotfix, а затем результат вливается и вmain, и вdevelop
Ветка develop — это не черновик кода, а стабильная, но еще не продакшен-готовая ветка. В ней должны проходить автоматические тесты, регрессионные проверки и интеграционные сценарии.
Основные задачи ветки develop
Ветка develop выполняет сразу несколько важных ролей:
- Централизация изменений для следующего релиза
- Разделение продакшена (
main) и активной разработки - Удобная основа для feature-веток
- Точка интеграции и раннего обнаружения конфликтов
- Связующее звено с CI/CD: тесты, сборки, проверочные деплои
Давайте разберем эти задачи чуть подробнее.
Централизация изменений
Все изменения, которые должны войти в ближайший релиз, сначала попадают в develop. Это позволяет:
- Всегда понимать, что именно готовится к релизу
- Проводить полноценное тестирование с учетом всех новых фич
- Избежать хаотичного слияния прямо в
main
Разделение продакшена и разработки
Ветка main должна всегда соответствовать стабильному продакшену:
- Теги релизов вешаются именно на коммиты в
main - Любой откат на прошлую версию — это checkout по тегу или старому коммиту в
main
develop же:
- Может быть менее стабильной
- Может содержать изменения, которые еще не пройдены через полный цикл тестирования
- Используется для подготовки релизных веток
Создание и базовая настройка ветки develop
Создание ветки develop из main
Если у вас уже есть репозиторий с веткой main, вы можете создать develop так:
# Переходим на main
git checkout main
# Создаем ветку develop на основе main
git checkout -b develop
# Публикуем ветку на удаленном репозитории
git push -u origin develop
Комментарии к шагам:
git checkout main
# Здесь мы убеждаемся, что находимся в актуальной ветке main
git checkout -b develop
# Здесь мы создаем новую ветку develop, ответвленную от текущей main
git push -u origin develop
# Здесь мы отправляем ветку develop на сервер и связываем локальную ветку
# с удаленной origin/develop для удобства будущих push и pull
Теперь в репозитории есть две основные ветки: main и develop.
Настройка ветки по умолчанию
Во многих командах ветка по умолчанию на сервере — это main. Но если вы хотите, чтобы разработчики чаще создавали ветки именно от develop, можно:
- Оставить
mainветкой по умолчанию в GitHub/GitLab, но договориться в регламенте, что разработчики всегда создают ветки отdevelop - Или (по политике команды) сделать
developветкой по умолчанию в настройках репозитория
Важно четко проговорить с командой:
- От какой ветки создаются feature-ветки
- Куда по умолчанию направляются Pull Request или Merge Request
Работа с feature-ветками на основе develop
Общий цикл работы
Обычно цикл работы с фичами выглядит так:
- Разработчик обновляет локальную ветку
develop - Создает от нее новую ветку для фичи
- Реализует изменения и делает коммиты
- Пушит ветку и создает Pull Request в
develop - Проходит ревью, автоматические проверки
- После одобрения фича вливается в
develop
Смотрите, я покажу вам, как это может выглядеть по шагам.
# 1. Обновляем develop
git checkout develop
git pull origin develop
# 2. Создаем ветку фичи
git checkout -b feature/new-payment-flow
# 3. Работаем над кодом, коммитим изменения
git add .
git commit -m "Add new payment flow logic"
# 4. Отправляем ветку на сервер
git push -u origin feature/new-payment-flow
Комментарии:
git pull origin develop
# Здесь мы подтягиваем все последние изменения teammates в develop
git checkout -b feature/new-payment-flow
# Здесь мы создаем отдельную ветку для новой фичи
# Именование по шаблону feature/<краткое-описание> упрощает навигацию
git commit -m "Add new payment flow logic"
# Здесь мы сохраняем изменения в локальной истории ветки фичи
git push -u origin feature/new-payment-flow
# Здесь мы отправляем ветку фичи на сервер, чтобы открыть Pull Request
Именование веток
Чтобы работа с develop была прозрачной, обычно вводят соглашения:
- Для фич:
feature/short-description - Для багфиксов:
bugfix/issue-1234-fix-login - Для экспериментальных задач:
experiment/new-cache-strategy
Важно, чтобы по имени ветки уже было понятно:
- К какому типу задач она относится
- Какую проблему решает или какую фичу реализует
Слияние изменений в develop
Открытие Pull Request в develop
После реализации фичи разработчик открывает Pull Request:
- Source branch: ветка фичи
- Target branch:
develop
Здесь вступает в игру процесс ревью:
- Проверка кода другими разработчиками
- Автоматические проверки CI (тесты, линтеры, форматирование)
- Обсуждение архитектурных решений
Пример (словесно):
- В GitHub вы выбираете base branch =
develop, compare branch =feature/new-payment-flow - В описании PR указываете, что именно реализовано, какие части кода затронуты, как тестировать
Merge commit, squash или rebase
Вопрос, который часто встает при работе с develop: как именно сливать ветки?
Есть три основных стратегии:
- Merge commit (по умолчанию)
- Squash and merge
- Rebase and merge
Их выбор — вопрос политики команды, но общие рекомендации такие:
- Если вы хотите сохранять историю коммитов из feature-веток — используйте обычный merge
- Если хотите более чистую историю в
develop— используйте squash (один коммит на фичу) - Rebase and merge стоит использовать аккуратно, особенно при командной работе
Например, squash может быть удобен:
# После ревью GitHub автоматически сделает один коммит в develop
# с суммарными изменениями из feature/new-payment-flow
Плюс подхода с squash:
- История
developсостоит из логических блоков-фич - Легче делать
git bisectи анализировать, какой коммит внес проблему
Синхронизация develop и feature-веток
Почему важно регулярно обновлять ветки от develop
Ветка develop активно меняется: в нее постоянно вливаются фичи и фиксы. Если вы долго работаете в своей ветке и не обновляете ее от develop, на момент слияния вы можете получить:
- Большое количество конфликтов
- Неожиданные проблемы с интеграцией
- Сбой тестов, которых не было в вашей локальной среде
Поэтому хорошая практика — периодически подтягивать изменения из develop в свою feature-ветку.
Пример слияния develop в feature-ветку
Давайте посмотрим, как это выглядит в коде.
# Находимся в ветке фичи
git checkout feature/new-payment-flow
# Подтягиваем последние изменения из develop
git fetch origin
git merge origin/develop
Комментарии:
git fetch origin
# Здесь мы обновляем локальную информацию о всех ветках на сервере
git merge origin/develop
# Здесь мы сливаем изменения из актуального develop в нашу feature-ветку
# На этом шаге могут появиться конфликты, которые нужно решить
После решения конфликтов:
# После ручного решения конфликтов:
git add .
git commit -m "Resolve conflicts with develop"
git push
Альтернатива: rebase на develop
Иногда команда предпочитает использовать rebase, чтобы история ветки выглядела как будто вы начинали разработку уже от актуального состояния develop.
git checkout feature/new-payment-flow
git fetch origin
git rebase origin/develop
Комментарии:
git rebase origin/develop
# Здесь мы "переписываем" историю feature-ветки так, будто она
# создавалась от текущего коммита develop
# Важно - rebase лучше делать только со своими ветками,
# которыми никто другой не пользуется
После rebase нужно сделать git push --force-with-lease:
git push --force-with-lease
# Здесь мы аккуратно обновляем удаленную ветку, проверяя,
# что никто другой не успел запушить туда свои коммиты
Релизы и ветка develop
Подготовка релиза из develop
Когда набор изменений в develop считается готовым к релизу, есть два основных подхода:
- Прямое слияние
developвmain(для небольших проектов) - Создание отдельной релизной ветки
release/x.y.zотdevelop
Рассмотрим вариант с релизной веткой, как более структурированный.
# Переходим на develop и обновляем его
git checkout develop
git pull origin develop
# Создаем релизную ветку
git checkout -b release/1.5.0
# Пушим релизную ветку на сервер
git push -u origin release/1.5.0
В этой ветке:
- Фиксятся только баги и проблемы, найденные тестировщиками
- Не добавляются новые фичи
- Стабилизируется релиз
После завершения работ:
# Слияние релиза в main
git checkout main
git merge --no-ff release/1.5.0
git tag -a v1.5.0 -m "Release 1.5.0"
git push origin main --follow-tags
# Слияние релиза обратно в develop (если были фиксы только в релизе)
git checkout develop
git merge --no-ff release/1.5.0
git push origin develop
Комментарии:
git merge --no-ff release/1.5.0
# Здесь мы явно фиксируем в истории факт существования релизной ветки
# Это упрощает анализ истории версий
git tag -a v1.5.0 -m "Release 1.5.0"
# Здесь мы создаем аннотированный тег для конкретной версии релиза
Горячие исправления и их влияние на develop
Иногда критическая ошибка обнаруживается уже в продакшене. В этом случае часто создают ветку hotfix от main.
# Создаем hotfix от main
git checkout main
git pull origin main
git checkout -b hotfix/fix-critical-crash
# Работаем над исправлением
git commit -am "Fix critical crash on startup"
git push -u origin hotfix/fix-critical-crash
После проверки и ревью:
# Слияние hotfix в main
git checkout main
git merge --no-ff hotfix/fix-critical-crash
git tag -a v1.5.1 -m "Hotfix 1.5.1"
git push origin main --follow-tags
# Важно - этот же hotfix нужно влить и в develop
git checkout develop
git pull origin develop
git merge --no-ff hotfix/fix-critical-crash
git push origin develop
Обратите внимание: изменения, которые исправили баг в продакшене, обязательно должны попасть в develop, иначе в будущем релизе баг может вернуться.
Правила и рекомендации для работы с develop
Какие коммиты допустимы напрямую в develop
В идеальном мире любые изменения в develop приходят только через Pull Request из отдельных веток. Но иногда допускаются прямые коммиты. Давайте уточним, в каких случаях это может быть разумно:
Допустимо:
- Мелкие правки документации
- Настройки CI, которые не затрагивают код приложения
- Исправление орфографических ошибок в комментариях
Нежелательно:
- Добавлять фичи
- Вносить изменения в бизнес-логику
- Править схемы БД и миграции
Лучше всегда придерживаться правила: любая фича или существенный багфикс — только через отдельную ветку и Pull Request в develop.
Требования к стабильности develop
Обычно вводят следующие требования к develop:
- Все unit-тесты должны проходить
- Основные интеграционные тесты не должны падать
- Код должен успешно собираться
- Не допускается заведомо некомпилируемый код
Смотрите, я покажу вам типичный пайплайн на CI для ветки develop:
- Запуск линтеров (например, ESLint, golangci-lint, Pylint)
- Запуск unit-тестов
- Запуск интеграционных тестов
- Соборка артефакта (docker-образ, артефакт сборки)
- (Опционально) Деплой на staging-окружение
Если любой из шагов падает, команда должна:
- Остановить слияния в
develop - Исправить проблему как можно скорее
- Не начинать новые feature-ветки от потенциально сломанного
developбез понимания последствий
Интеграция ветки develop с CI/CD
Автоматические проверки для develop
Ветка develop — это идеальное место для плотной интеграции с CI.
Типичный набор задач CI для develop:
- Проверка форматирования (например,
go fmt,black,prettier) - Линтинг
- Unit-тесты
- Интеграционные и e2e тесты (если не слишком ресурсоемко)
- Статический анализ кода
Пример конфигурации пайплайна в псевдо-YAML (без привязки к конкретной системе):
# Здесь мы определяем, что пайплайн запускается при пуше в ветку develop
on:
push:
branches:
- develop
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
# Здесь мы клонируем репозиторий
- name: Checkout code
uses: actions/checkout@v4
# Здесь мы устанавливаем зависимости
- name: Install dependencies
run: |
npm ci
# Здесь мы запускаем линтеры
- name: Run linters
run: |
npm run lint
# Здесь мы запускаем тесты
- name: Run tests
run: |
npm test
Деплой из develop на тестовые окружения
Многие команды используют develop как:
- Источник для автоматического деплоя на dev или staging окружение
- Базу для тестирования QA-командой
- Место, где заказчики могут посмотреть предварительную версию продукта
Выглядит это обычно так:
- Любой успешный пуш в
developзапускает пайплайн - Если все проверки прошли, код деплоится в тестовое окружение
- QA проводит регрессию
- После подтверждения качества начинается подготовка релиза из
develop
Типичные проблемы и как их избежать
Чрезмерное разрастание develop
Иногда develop превращается в свалку недоделанных фич, временных решений и застарелых веток. Чтобы этого избежать:
- Вводите четкое правило: незавершенные фичи не должны без фича-флагов попадать в
develop - Используйте feature-toggles, чтобы внедрять код, который еще не полностью готов, но не ломает существующее поведение
- Регулярно чистите старые, неиспользуемые ветки, которые были слиты в
develop
Длительно живущие feature-ветки
Если ветка фичи живет слишком долго (недели или месяцы), растет риск:
- Массивных конфликтов с
develop - Ошибок интеграции
- Потери контекста у разработчиков
Решения:
- Разбивайте большие задачи на более мелкие фичи
- Чаще вливайте результаты в
develop - Используйте feature-флаги, чтобы внедрять частичные реализации
Конфликты между несколькими фичами
Когда несколько фич меняют одни и те же модули, конфликты неизбежны. Помочь может:
- Регулярная синхронизация feature-веток с
develop - Общие договоренности по очередности мержа сложных фич
- Обсуждение архитектурных изменений до начала реализации
Заключение
Ветка develop — это ключевой элемент предсказуемой и контролируемой модели разработки, особенно в командах, где над кодом одновременно работают несколько человек. Она:
- Отделяет стабильный продакшен в
mainот текущей разработки - Служит центральной точкой интеграции фич и багфиксов
- Является основой для релизных веток и горячих исправлений
- Тесно связана с CI/CD и процессами тестирования
При правильно выстроенных правилах и дисциплине команды develop помогает:
- Снизить риск поломок продакшена
- Сделать релизы предсказуемыми
- Упростить ревью и тестирование
- Повысить прозрачность всего процесса разработки
Ключевые моменты, которые стоит закрепить в команде:
- Все существенные изменения идут в
developчерез отдельные ветки и Pull Request - Ветка
developвсегда должна быть в рабочем, собираемом состоянии - Горячие исправления из
mainобязательно вливаются обратно вdevelop - CI для
developдолжен быть достаточно строгим, чтобы ловить проблемы на ранних этапах
Частозадаваемые технические вопросы по теме и ответы
Как защитить ветку develop от прямых пушей
Настройте защиту ветки в GitHub или GitLab:
- Откройте настройки репозитория
- Найдите раздел Branch protection
- Выберите ветку
develop - Включите:
- Запрет прямых пушей
- Обязательные Pull Request
- Обязательный проход CI перед merge
Теперь изменения можно вносить в develop только через Pull Request.
Как правильно обновить локальный develop, если я давно с ним не работал
- Переключитесь на локальный
develop - Подтяните изменения с сервера
- Обновите свои feature-ветки от него
Команды:
git checkout develop
git fetch origin
git pull origin develop
git checkout feature/your-branch
git merge origin/develop
Что делать, если мой PR в develop конфликтует с другим уже влитым PR
- Обновите локальный
develop - Переключитесь на свою ветку
- Слейте в нее изменения из
develop - Разрешите конфликты и обновите PR
git checkout develop
git pull origin develop
git checkout feature/your-branch
git merge origin/develop
# Разрешаете конфликты в файлах
git add .
git commit -m "Resolve conflicts with develop"
git push
Как откатить ошибочный merge в develop
Если merge уже попал в удаленный develop:
- Найдите хеш коммита merge
- Создайте revert-коммит
git checkout develop
git pull origin develop
git revert -m 1 <hash-merge-commit>
git push origin develop
Здесь -m 1 указывает, что вы хотите сохранить первую родительскую ветку (обычно сам develop) и отменить изменения, пришедшие из merge.
Можно ли делать релиз напрямую из develop без ветки release
Да, если процесс в команде простой:
- Убедитесь, что
developстабилен и протестирован - Влейте
developвmain - Поставьте тег релиза
git checkout main
git pull origin main
git merge --no-ff develop
git tag -a v1.6.0 -m "Release 1.6.0"
git push origin main --follow-tags
Но при этом сложнее фиксировать баги релиза отдельно от продолжающейся разработки, поэтому для более сложных проектов лучше использовать отдельные ветки release/x.y.z.
Постройте личный план изучения Git до уровня Middle — бесплатно!
Git — часть карты развития Frontend
100+ шагов развития
30 бесплатных лекций
300 бонусных рублей на счет
Бесплатные лекции
Все гайды по Git
Лучшие курсы по теме

Основы Git
Антон Ларичев
TypeScript с нуля
Антон Ларичев