При разработке есть три основных потребности:
- Новые фичи
- Хотфиксы
- Рефакторинг
Крупная фича — это блок работы, который нужно катить в прод одновременно.
Крупная фича декомпозируется на более мелкие задачи, которые могут выполняться разными людьми.
Примеры крупных фич: новая страница, форма регистрации или ряд изменений на нескольких страницах, имеющих один продуктовый контекст.
-
Создаётся ветка с говорящим названием, например,
new-auth-page.
С ней очень часто придётся работать, название должно быть запоминающимся.
Не нужно использовать веткуdevelop, потому что одновременно можно разрабатывать несколько независимых фич. -
Крупная фича делится на более мелкие, которые оформляются как Pull Requests в фича-ветку. Основная часть работы — работа над такими небольшими тасками:
- Под каждый таск бранчимся от фича-ветки
$ git checkout -b PN-1234Подсказка: Флаг
-b(branch) означает, что нужно создать новую ветку и перейти в неё.Если вы используете систему тикетов, где у задач есть номера, название ветки должно совпадать с номером задачи. Это поможет найти ветку, если пришлось передать задачу от одного разработчика другому, поможет удалить старые ветки. Плюс, возможно, будут какие-то профиты от интеграции системы тикетов и репозитория. Если же у задач номеров нет, используйте говорящие названия. Неправильно:
fixПравильно:fix-email-validation-
Пишем код;
-
Коммитим согласно соглашению по именованию;
-
Создаём Pull Request в фича-ветку;
-
Если есть конфликты, нужно подмерджить фича-ветку и исправить их.
$ git fetch $ git merge origin/feature-branch $ vim file.js # fix conflicts $ git commit- Когда Pull Request смёрджен, ветка удаляется;
-
Когда все мелкие фичи замерджены, крупная фича тестируется в своей ветке и отправляется в прод.
-
Если всё ок, ветка мерджится в
master.
Для хотфиксов и небольших фич заводится отдельная ветка от master, название ветки должно совпадать с номером задачи:
$ git checkout -b PN-1234
Подсказка: Флаг -b (branch) означает, что нужно создать новую ветку и перейти в неё.
После этого в ветке пишется и коммитится код, согласно соглашению по именованию:
$ git commit -m 'fix(scope): subject'
Ветка пушится и создаётся Pull Request в master:
$ git push -u origin PN-1234
Подсказка: Флаг -u или --set-upstream означает, что нужно связать локальную и remote ветку.
Тогда в следующий раз не нужно будет писать remote и название ветки при git push и git pull.
Подсказка: Если вы хотите создавать Pull Requests из консоли, воспользуйтесь утилитой hub от GitHub и командой hub pull-request
Код отправляется в прод. Если на проде всё ок, ветка подмердживается в master.
Рефакторинг нужно делать от ветки master и как можно быстрее вливать в неё.
Часто рефакторинг затрагивает много кода, если затянуть мердж в основную ветку,
может быть много конфликтов. По этой же причине не нужно делать рефакторинг
в фича-ветках.
Если нужно что-то отрефакторить, чтобы написать новую функциональность, не ленитесь,
создайте отдельную ветку под рефакторинг и сделайте Pull Request в master.
Когда нужно подготовить релиз, от мастера заводится релиз-ветка. Название ветки должно совпадать с номером задачи или начинаться
со слова release. Например, release-login-page, release-123 или release-15-12-2016.
После этого в релиз-ветку подмердживаются нужные фичи/фиксы, составляющие релиз.
Обязательно должна быть задача, отражающая состав релиза.
После проводится тестирование и ветка отправляется в прод.
Если на проде всё хорошо и решено оставить релиз в продакшене, ветка помердживается в master
Это нужно, чтобы можно было в любой момент безболезненно откатиться. Если окажется, что вместе с последней фичей выкатился критичный баг, раскатывается версия из `master`. `master` всегда остаётся стабильным, нельзя получить нестабильный код, ответвившись от `master`. Или, например, после релиза заказчик понял, что это не совсем то, что было необходимо, и вообще ему еще надо подумать как это лучше реализовать. Основная проблема ветки `develop` — никогда не очевидно, что там должно быть, чего не должно и что там сейчас. Если в `develop` идёт разработка новой крупной фичи, мы не можем разрабатывать две фичи, не меняя процесс. Если там же делается рефакторинг, он пропадёт, если разработку фичи приходится отложить в пользу других. В `develop` может попасть любой неоттестированный код, не привязанный к задаче, поэтому приходится всё равно заводить ветки под релизы, чтобы провести регрессионное тестирование.