git flow работаем по чистому
10.03.2015Если вы все еще создаете ветки вручную (git branch new-feature), либо не используете их вообще (что еще печальней :)), советую присмотреться к небольшой надстройке над git - git-flow. Данный инструмент значительно упростит и сделает понятной работу для всех участников репозитория, даже если вы работаете над проектом в одиночку, он позволит вести вполне стандартную модель веток (master + develop) и поддерживать семантического версионирование релизов.Что же делает git-flow? Основная задача, это сопровождение трех типа веток проекта. А именно:
- master - главная ветвь для релизов
- develop или dev - главная ветвь разработки
- feature/* - ветви с новыми функциями, которые потенциально будут слиты в dev
- hotfix/* - ветви хотфиксов master
- support/* - ветки поддержки
apt-get install git-flow
port install git-flow
wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash
$ 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.
$ mkdir testrepo
$ cd testrepo/
testrepo$ git init
$ 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? []
$ 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
- запустим git flow release start 0.0.1
- добавим файл с информацией о релизе и зафиксируем изменения
- запустим 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'
Получили:
- создалась ветка release/0.0.1
- мы внесли в нее файл информации релиза (release-0.0.1.txt)
- ветка релиза слита в мастер
- создан тег 0.0.1
- ветка релиза слита в develop
- ветка релиза удалена (локально)
- репозиторий переведен на develop
Мой вывод: git-flow - отличный инструмент, который позволяет вести чистую модель ветвления в проекте, и упростить работу.
Комментарии