git flow работаем по чистому

Если вы все еще создаете ветки вручную (git branch new-feature), либо не используете их вообще (что еще печальней :)), советую присмотреться к небольшой надстройке над git - git-flow. Данный инструмент значительно упростит и сделает понятной работу для всех участников репозитория, даже если вы работаете над проектом в одиночку, он позволит вести вполне стандартную модель веток (master + develop) и поддерживать семантического версионирование релизов.Что же делает git-flow? Основная задача, это сопровождение трех типа веток проекта. А именно:

  1. master - главная ветвь для релизов
  2. develop или dev - главная ветвь разработки
  3. feature/* - ветви с новыми функциями, которые потенциально будут слиты в dev
  4. hotfix/* - ветви хотфиксов master
  5. support/* - ветки поддержки
По сути git-flow представляет из себя cli надстройку над git которая создает, сливает, пушит и теггирует ветви просто предоставив одну команду вместо нескольких git команд.
Установим данный инструмент, и рассмотрим простой пример его использования.
Для пользователей ubuntu:
 apt-get install git-flow
Для mac-ов:
 port install git-flow
Для пользователей Windows (через cygwin):
 wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
Если установка прошла успешно, попробуйте ввести "git flow", ниже должно вывестись список доступных команд:
$ git flow
usage: git flow <subcommand>

Available subcommands are:
   init      Initialize a new git repo with support for the branching model.
   feature   Manage your feature branches.
   release   Manage your release branches.
   hotfix    Manage your hotfix branches.
   support   Manage your support branches.
   version   Shows version information.
   config    Manage your git-flow configuration.

Try 'git flow <subcommand> help' for details.
Создадим тестовый репозиторий, и попробуем использовать некоторые преимущества git flow.
$ mkdir testrepo
$ cd testrepo/
testrepo$ git init
На данном этапе нам нужно инициировать конфигурацию git-flow. Процесс инициализации позволяет задать свои имена для веток  назначения, но в нашем случае мы будем использовать стандартные имена (master, develop итд.). Запускаем и вводим везде enter:
$ git flow init
No branches exist yet. Base branches must be created now.
Branch name for production releases: [master]
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
Допустим сейчас нам нужно сделать "фичу X" - создадим для этого отдельную ветку командой "git flow feature start X":
$ git flow feature start X
Перешел к новой ветке 'feature/X'

Summary of actions:
- A new branch 'feature/X' was created, based on 'develop'
- You are now on branch 'feature/X'

Now, start committing on your feature. When done, use:

     git flow feature finish X

В итоге у нас появиться ветка "feature/X". Попробуем внести изменения и зафиксировать их.

testrepo$ touch x.txt
testrepo$ git add x.txt
testrepo$ git commit -m 'add x'
[feature/X e1fc159] add x
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 x.txt

Но допустим сейчас появился баг в master ветке, который нужно срочно попроавить. Создадим хотфикс с помощью "git flow hotfix start fixbug":

testrepo$ git flow hotfix start fixbug
Перешел к новой ветке 'hotfix/fixbug'

Summary of actions:
- A new branch 'hotfix/fixbug' was created, based on 'master'
- You are now on branch 'hotfix/fixbug'

Follow-up actions:
- Bump the version number now!
- Start committing your hot fixes
- When done, run:

     git flow hotfix finish 'fixbug'

Таким образом мы создали ветвь "hotfix/fixbug" и перешли на нее:

 testrepo$ git branch
  develop
  feature/X
* hotfix/fixbug
  master

Поправим условный баг, и зафиксируем изменения:

testrepo$ touch fixbug.txt
testrepo$ git add fixbug.txt
testrepo$ git commit -m 'fix bug'
[hotfix/fixbug b6e5ec8] fix bug
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fixbug.txt

Далее нам необходимо применить хотфикс (слияние или rebase) к master и develop, чтобы структура проекта осталась целостной. Используем для этого "git flow hotfix finish fixbug":

testrepo$ git flow hotfix finish fixbug
Перешел к ветке 'master'
Merge made by the 'recursive' strategy.
 fixbug.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fixbug.txt
Перешел к ветке 'develop'
Merge made by the 'recursive' strategy.
 fixbug.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 fixbug.txt
Удалена ветка hotfix/fixbug (была b6e5ec8).

Summary of actions:
- Hotfix branch 'hotfix/fixbug' has been merged into 'master'
- The hotfix was tagged 'fixbug'
- Hotfix tag 'fixbug' has been back-merged into 'develop'
- Hotfix branch 'hotfix/fixbug' has been locally deleted
- You are now on branch 'develop'

Что мы получили в итоге (дословно написано выше):

  • ветка hotfix/fixbug слита в master
  • хотфиксу назначен тег fixbug
  • hotfix/fixbug слит в develop
  • ветка hotfix/fixbug удалена (локально)
  • репозиторий переключен на develop

Ну разве это не прекрасно :)? Далее, попробуем теперь завершить нашу "фичу X" с помощью "git flow feature finish X":

testrepo$ git flow feature finish X
Уже в 'develop'
Merge made by the 'recursive' strategy.
 x.txt | 0
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 x.txt
Удалена ветка feature/X (была e1fc159).

Summary of actions:
- The feature branch 'feature/X' was merged into 'develop'
- Feature branch 'feature/X' has been locally deleted
- You are now on branch 'develop'

Что мы получили:

  • ветка feature/X слита в develop
  • ветка feature/X удалена (локально)
  • репозиторий переключен на develop
Похожим образом можно создавать релизы и версионировать их, сделаем релиз 0.0.1. Для этого выполним такую последовательность:
  1. запустим git flow release start 0.0.1
  2. добавим файл с информацией о релизе и зафиксируем изменения
  3. запустим git flow release finish 0.0.1
$ git flow release start 0.0.1
Перешел к новой ветке 'release/0.0.1'

Summary of actions:
- A new branch 'release/0.0.1' was created, based on 'develop'
- You are now on branch 'release/0.0.1'

Follow-up actions:
- Bump the version number now!
- Start committing last-minute fixes in preparing your release
- When done, run:

     git flow release finish '0.0.1'

testrepo$ echo 'changes' > release-0.0.1.txt
testrepo$ git add release-0.0.1.txt
testrepo$ git commit -m 'changes'
[release/0.0.1 ae2ae9f] changes
 1 file changed, 1 insertion(+)
 create mode 100644 release-0.0.1.txt
testrepo$ git flow release finish 0.0.1
Перешел к ветке 'master'
Merge made by the 'recursive' strategy.
 release-0.0.1.txt | 1 +
 x.txt             | 0
 2 files changed, 1 insertion(+)
 create mode 100644 release-0.0.1.txt
 create mode 100644 x.txt
Перешел к ветке 'develop'
Merge made by the 'recursive' strategy.
 release-0.0.1.txt | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 release-0.0.1.txt
Удалена ветка release/0.0.1 (была ae2ae9f).

Summary of actions:
- Release branch 'release/0.0.1' has been merged into 'master'
- The release was tagged '0.0.1'
- Release tag '0.0.1' has been back-merged into 'develop'
- Release branch 'release/0.0.1' has been locally deleted
- You are now on branch 'develop'

Получили:

  1. создалась ветка release/0.0.1
  2. мы внесли в нее файл информации релиза (release-0.0.1.txt)
  3. ветка релиза слита в мастер
  4. создан тег 0.0.1
  5. ветка релиза слита в develop
  6. ветка релиза удалена (локально)
  7. репозиторий переведен на develop

Мой вывод: git-flow - отличный инструмент, который позволяет вести чистую модель ветвления в проекте, и упростить работу.

Комментарии