1 Введение в Git Flow
Все мы знаем, что функция ветвления в git действительно намного удобнее, чем svn.而且也非常推荐使用分支来做开发
Мой подход заключается в том, чтобы иметь 2 ветки для каждого проекта, осваивать и разрабатывать.master 分支是主分支, 保证程序有一个 稳定版本, develop 则是开发用的分支, 几乎所有的功能开发, bug 修复都在这个分支上, 完成后再合并回 master
.
Но ситуация не так проста: иногда, когда мы разрабатываем фичу, но в программе вдруг появляются ошибки, которые нужно вовремя исправить, нам нужно переключиться обратно на ветку master и создать на ее основе ветку hotfix. разрабатывают функцию, нужно остановиться и поработать над другой функцией, и когда возникают все эти проблемы, релиз может быть немного сложнее.
То есть ветка git очень мощная,但是没有一套模型告诉我们应该怎样在开发的时候善用这些分支
. Модель Git Flow должна рассказать нам, как лучше использовать ветки Git.
Проще говоря,git-flow 就是在 git branch git tag基础上封装出来的代码分支管理模型
, смоделируйте фактическую разработку в нескольких сценариях поддержки исправлений выпуска основной функции разработки,其中 master 对应发布上线,develop 对应开发,其他几个在不同的情况下出现
. Благодаря инкапсуляции,git-flow 屏蔽了 git branch 等相对来说比较复杂生硬的命令(git branch 还是比较复杂的,尤其是在多分支情况下),简单而且规范的解决了代码分支管理问题
.
Проще говоря, Git Flow разбивает ветку на 2 основные и 3 временные вспомогательные ветки:
Основная отрасль
мастер: всегда в **
即将发布(production-ready)状态
**;develop:
最新的开发状态
;
вспомогательная ветвь
feature:
开发新功能的分支, 基于 develop
, после завершенияmerge 回 develop
;release:
准备要发布版本的分支, 用来修复 bug. 基于 develop
, после завершенияmerge 回 develop 和 master
;hotfix:
修复 master 上的问题
, не могу дождаться, когда релизная версия появится в сети немедленно.基于 master
, после завершенияmerge 回 master 和 develop
;
2 Использование Git Flow
2.1 Установка и сборка Git Flow
Установите git-поток:
➜ brew install git-flow
Автор также предоставляет командный инструмент git-flow для построения модели git-flow в новом каталоге:
➜ 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 init
Which branch should be used for bringing forth production releases?
- master
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 инициализируется.
2.2 Сценарий 1: Разработка новой функции, кодовое имя f1
-
На основе разработки, открытия новой функциональной ветки
После завершения предыдущей операции сборки текущая ветка становится develop.Любая разработка должна начинаться с develop:
➜ git flow feature start f1
git-flow 从 develop 分支创建了一个新的分支 feature/f1,并自动切换到这个分支下面
. Затем вы можете разработать функции f1, и вы можете зафиксировать несколько раз в середине.Отправьте ветку f1 на удаленный сервер для совместной работы с другими разработчиками:
➜ git flow feature publish f1 或者 ➜ git push origin feature/f1
-
Завершить разработку функции, завершить новую ветвь функции и удалить:
➜ git flow feature finish f1
feature/f1 分支的代码会被合并到 develop 里面,然后删除该分支,切换回 develop
На этом сцена разработки новой функции завершена. При разработке функции f1, если f1 не завершена, одновременно можно запустить функцию f2.
2.3 Сценарий 2: Выпуск онлайн, кодовое имя 0.1
-
На основе разработки разработайте ветку релиза
➜ git flow release start 0.1 Switched to a new branch 'release/0.1' Summary of actions: - A new branch 'release/0.1' was created, based on 'develop' - You are now on branch 'release/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.1'
-
git-flow создает новую ветку релиз/0.1 из ветки разработки и переключается на эту ветку Следующее, что нужно сделать, это изменить номер версии и другие операции выпуска. после завершения:
➜ git flow release finish 0.1 Switched to branch 'master' Merge made by the 'recursive' strategy. f1 | 1 + version | 1 + 2 files changed, 2 insertions(+) create mode 100644 f1 create mode 100644 version Switched to branch 'develop' Merge made by the 'recursive' strategy. version | 1 + 1 file changed, 1 insertion(+) create mode 100644 version Deleted branch release/0.1 (was d77df80). Summary of actions: - Latest objects have been fetched from 'origin' - Release branch has been merged into 'master' - The release was tagged '0.1' - Release branch has been back-merged into 'develop' - Release branch 'release/0.1' has been deleted
-
git-flow переключится на основную разработку, в свою очередь, чтобы объединить изменения в выпуске / 0.1, а затем использовать тег git, чтобы пометить текущий выпуск с помощью тега 0.1.Вы можете просмотреть все теги через тег git:
➜ git:(master) git tag 0.1 0.2
2.3 Сценарий 3: Срочное исправление ошибки, кодовое имя bug1
-
На основе мастера откройте ветку исправления
➜ git flow hotfix start bug1 Switched to a new branch 'hotfix/bug1' Summary of actions: - A new branch 'hotfix/bug1' was created, based on 'master' - You are now on branch 'hotfix/bug1' Follow-up actions: - Bump the version number now! - Start committing your hot fixes - When done, run: git flow hotfix finish 'bug1'
-
git-flow создает новую ветку hotfix/bug1 из основной ветки и переключается на нее. Следующее, что нужно сделать, это исправить ошибку, и когда это будет сделано:
➜ git flow hotfix finish bug1 Switched to branch 'master' Merge made by the 'recursive' strategy. f1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Switched to branch 'develop' Merge made by the 'recursive' strategy. f1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) Deleted branch hotfix/bug1 (was aa3ca2e). Summary of actions: - Latest objects have been fetched from 'origin' - Hotfix branch has been merged into 'master' - The hotfix was tagged 'bug1' - Hotfix branch has been back-merged into 'develop' - Hotfix branch 'hotfix/bug1' has been deleted
git-flow переключится на основную ветку разработки, чтобы объединить исправление/ошибку1, а затем удалит исправление/ошибку1. На этом исправление завершено.
git-flow 的 feature release 都是从 develop 分支创建,hotfix support 都是从 master 分支创建。
3 Классическая спецификация управления филиалами
Как показано на фиг.1:
-
最稳定的代码放在 master 分支上(相当于 SVN 的 trunk 分支)
, мы не фиксируем код непосредственно в ветке master, в этой ветке можно выполнять только операции слияния кода, например слияние кода других веток в ветку master. -
мы
日常开发中的代码需要从 master 分支拉一条 develop 分支出来
, ветка доступна всем, но в целом,我们也不会直接在该分支上提交代码,代码同样是从其它分支合并到 develop 分支上去
. -
Когда нам нужно разработать функцию,
需要从 develop 分支拉出一条 feature 分支
, такие как функция-1 и функция-2, параллельно разрабатывают определенные функции на этих ветвях. -
Когда разработка функции завершена, мы решаем, что нам нужно выпустить определенную версию,
此时需要从 develop 分支上拉出一条 release 分支
, например выпуск-1.0.0,并将需要发布的特性从相关 feature 分支一同合并到 release 分支上
, а затем тестовая среда будет развернута для ветки релиза, инженеры-тестировщики будут проводить функциональное тестирование в этой ветке, а инженеры-разработчики будут исправлять ошибки в этой ветке. -
Когда инженер-испытатель не может найти никаких ошибок,
我们可将该 release 分支部署到预发环境,再次验证以后,均无任何 bug,此时可将 release 分支部署到生产环境
. -
После того, как онлайн будет завершен,
将 release 分支上的代码同时合并到 develop 分支与 master 分支,并在 master 分支上打一个 tag
, например v1.0.0. -
Когда в производстве обнаруживаются ошибки, мы
需要从对应的 tag 上(例如 v1.0.0)拉出一条 hotfix 分支(例如 hotfix-1.0.1),并在该分支上做 bug 修复
. После того, как ошибка будет полностью исправлена,需将 hotfix 分支上的代码同时合并到 develop 分支与 master 分支
.
У нас также есть требования к номерам версий,格式为:x.y.z,其中,x 用于有重大重构时才会升级,y 用于有新的特性发布时才会升级,z 用于修改了某个 bug 后才会升级
. Для каждого микросервиса нам нужно строго следовать указанному выше режиму разработки.
Отличия от управления ветвями модели Git Flow:
feature分支开发完成后,暂时不合并至develop
, но откройте релизную ветку на основе разработки, объедините функциональную ветку с релизной веткой для тестирования;
release分支测试通过后,部署到生产环境,将release分支代码合并到develop分支与master分支,并在master分支打一个tag
;