• 简介

  Gitflow工作流程围绕项目发布定义了严格的分支模型。

  为不同的分支分配了非常明确的角色,并且定义了使用场景和用法。除了用于功能开发的分支,它还使用独立的分支进行发布前的准备、记录以及后期维护。

  • 工作原理

  流程仍然使用一个中央代码仓库,它是所有开发者的信息交流中心。跟其他的工作流程一样,开发者在本地完成开发,然后再将分支代码推送到中央仓库。唯一不同的是项目中分支的结构。

用于记录历史的分支

  Gitflow使用两个分支来记录项目开发的历史,而不是使用单一的master分支。

  在Gitflow流程中:

  master只是用于保存官方的发布历史,

  而develop分支才是用于集成各种功能开发的分支。

  使用版本号为master上的所有提交打标签(tag)也很方便。

用于功能开发的分支

  每一个新功能的开发都应该各自使用独立的分支。

  为了备份或便于团队之间的合作,这种分支也可以被推送到中央仓库。

  在创建新的功能开发分支时,父分支应该选择develop(而不是master)。

  当功能开发完成时,改动的代码应该被合并(merge)到develop分支。功能开发永远不应该直接牵扯到master。

用于发布的分支

  一旦develop分支积聚了足够多的新功能,可以基于develop分支建立一个用于产品发布的分支。

  意味着一个发布周期的开始,也意味着本次发布不会再增加新的功能——在这个分支上只能修复bug,做一些文档工作或者跟发布相关的任务。

  在一切准备就绪的时候,这个分支会被合并入master,并且用版本号打上标签。

  另外,发布分支上的改动还应该合并入develop分支——在发布周期内,develop分支仍然在被使用(一些开发者会把其他功能集成到develop分支)。使用专门的一个分支来为发布做准备的好处是,在一个团队忙于当前的发布的同时,另一个团队可以继续为接下来的一次发布开发新功能。

用于维护的分支

  发布后的维护工作或者紧急问题的快速修复也需要使用一个独立的分支。

  这是唯一一种可以直接基于master创建的分支。一旦问题被修复了,所做的改动应该被合并入master和develop分支(或者用于当前发布的分支)。

  在这之后,master上还要使用更新的版本号打好标签。

  • 开发实例

  创建develop分支

第一步是给默认的master配备一个develop分支。一种简单的做法是:让一个开发者在本地建立一个空的develop分支,然后把它推送到服务器。

git branch develop
git push -u origin develop

develop分支将包含项目的所有历史,而master会是一个缩减版本。现在,其他开发者应该克隆(clone)中央仓库,并且为develop创建一个追踪分支。

git clone ssh://user@host/path/to/repo.git
git checkout -b develop origin/develop

A和B开发新功能

分别开发新功能开始。他们俩各自建立了自己的分支。注意,他们在创建分支时,父分支不能选择master,要选择develop。

git checkout -b some-feature develop

  他们俩都在自己的功能开发分支上开展工作。通常就是这种Git三部曲:edit,stage,commit

git status
git add <some-file>
git commit

  A把他的功能开发好了

  A的功能做完了。如果她所在的团队使用“拉拽请求”,此刻便是一个合适的时机——可以提出一个将她所完成的功能合并入develop分支的请求。

  要不然,可以自行将代码合并入本地的develop分支,然后再推送到中央仓库,像这样:

git pull origin develop
git checkout develop
git merge some-feature
git push
git branch -d some-feature

  第一条命令确保了本地的develop分支拥有最新的代码——这一步必须在将功能代码合并之前做!

  注意,新开发的功能代码永远不能直接合并入master。

  

  A开始准备一次发布

  尽管B还在忙着开发他的功能,A却可以开始准备这个项目的第一次正式发布了。

  类似于功能开发,她使用了一个新的分支来做产品发布的准备工作。在这一步,发布的版本号也最初确定下来。

git checkout -b release-0.1 develop

  这个分支专门用于发布前的准备,包括一些清理工作、全面的测试、文档的更新以及任何其他的准备工作。它是专为产品发布服务的。

  一旦A创建了这个分支并把它推向中央仓库,这次产品发布包含的功能也就固定下来了。

  

  A完成了发布

  

  

  一切准备就绪之后,A就要把发布分支合并入master和develop分支,然后再将发布分支删除。

  注意,往develop分支的合并是很重要的,因为开发人员可能在发布分支上修复了一些关键的问题,而这些修复对于正在开发中的新功能是有益的。再次提醒一下,如果A所在的团队强调代码评审(Code Review),此时非常适合提出这样的请求。 

git checkout master
git merge release-0.1
git push
git checkout develop
git merge release-0.1
git push
git branch -d release-0.1

  发布分支扮演的角色是功能开发(develop)与官方发布(master)之间的一个缓冲。无论什么时候你把一些东西合并入master,你都应该随即打上合适的标签。

git tag -a 0.1 -m"Initial public release" master
git push --tags

  Git支持钩子(hook)的功能,也就是说,在代码仓库里某些特定的事件发生的时候,可以执行一些预定义的脚本。

  因此,一种可行的做法是:在服务器端配置一个钩子,当你把master推送到中央仓库或者推送标签时,Git服务器能为产品发布进行一次自动的构建。

  用户发现了一个bug

  

  当前发布的产品里有一个bug。为了解决这个问题,A(或者B)基于master创建了一个用于维护的分支。

  在这个分支上修复了那个bug,然后把改动的代码直接合并入master。 

git checkout -b issue-#001 master
# Fix the bug
git checkout master
git merge issue-#001
git push

  跟用于发布的分支一样,在维护分支上的改动也需要合并入develop分支,这一点是很重要的!

git checkout develop
git merge issue-#001
git push
git branch -d issue-#001

  上面介绍的是git flow 的详细过程,但是这样开发起来会接的是否麻烦,git flow对其进行了封装简化。

  使用

    • 初始化: git flow init

    • 开始新Feature: git flow feature start MYFEATURE

    • Publish一个Feature(也就是push到远程): git flow feature publish MYFEATURE

    • 获取Publish的Feature: git flow feature pull origin MYFEATURE

    • 完成一个Feature: git flow feature finish MYFEATURE

    • 开始一个Release: git flow release start RELEASE [BASE]

    • Publish一个Release: git flow release publish RELEASE
    • 发布Release: git flow release finish RELEASE
      别忘了git push --tags

    • 开始一个Hotfix: git flow hotfix start VERSION [BASENAME]

    • 发布一个Hotfix: git flow hotfix finish VERSION

git flow init

  这个命令会进行一些默认的配置,可以自动创建上面介绍的所有分支:master、develop、feature、relase、hotfix等分支。

  完成后当前所在分支就变成 develop. 任何开发都必须从 develop 开始:

  当进行新功能开发的时候:

git flow feature start some_awesome_feature

  完成功能开发之后:

git flow feature finish some_awesome_feature

  该命令将会把feature/some_awesome_feature合并到develope分支,然后删除功能(feature)分支。

    将一个 feature 分支推到远程服务器

git flow feature publish some_awesome_feature 
或者
git push origin feature/some_awesome_feature

  当你的功能点都完成时(需要发布新版本了),就基于develop创建一个发布(release)分支。

git flow release start v0.1.0 

  当你在完成(finish)一个发布分支时,它会把你所作的修改合并到master分支,同时合并回develop分支,所以,你不需要担心你的master分支比develop分支更加超前。

  当系统出现问题的时候,需要进行紧急修改的时候,就好基于master创建一个维护(hotfix)分支。

git flow hotfix start v0.1.0

  当你在完成(finish)一个维护分支时,它会把你所作的修改合并到master分支,同时合并回develop分支。

多人协作解决方案,git flow的使用的更多相关文章

  1. Git复习(五)之多人协作、git push失败、git pull失败

    多人协作 多人协作时,大家都会往master和dev分支上推送各自的修改. 现在,模拟一个你的小伙伴,可以在另一台电脑(注意要把SSH Key添加到GitHub)或者同一台电脑的另一个目录下克隆: $ ...

  2. Git详细教程---多人协作开发

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

  3. Git详细教程(2)---多人协作开发

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

  4. GitHub Flow & Git Flow 基于Git 的两种协作开发模式

    介绍基于Git 两种协作开发模式,GitHub Flow & Git Flow 对于Github 一些好用的特殊操作技巧 ,可以见GitHub 特殊操作技巧 和Git的基本操作 一 GitHu ...

  5. git多人协作式开发时分支管理策略

    什么是 git-flow? Git Flow是一套使用Git进行源代码管理时的一套行为规范 主分支Master 首先,代码库应该有一个.且仅有一个主分支.所有提供给用户使用的正式版本,都在这个主分支上 ...

  6. Git多人协作工作流程

    前言 之前一直把Git当做个人版本控制的工具使用,现在由于工作需要,需要多人协作维护文档,所以去简单了解了下Git多人协作的工作流程,发现还真的很多讲解的,而且大神也已经讲解得很清楚了,这里就做一个简 ...

  7. Git 多人协作开发的过程

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

  8. Git教程Git多人协作开发

    Git可以完成两件事情: 1. 版本控制 2.多人协作开发 如今的项目,规模越来越大,功能越来越多,需要有一个团队进行开发. 如果有多个开发人员共同开发一个项目,如何进行协作的呢. Git提供了一个非 ...

  9. git学习:多人协作,标签管理

    多人协作: 查看远程库的信息, git remote 推送分支到远程库 git push origin master/dev 注意:master是主分支,时刻需要与远程同步 dev是开发分支,也需要与 ...

随机推荐

  1. Android Studio 查看SQLite数据库存储位置及文件

    前言: 之前开发的一个记账本APP,用的是SQLite数据库,会有一些网友问如何查看数据库,这篇博文对此进行一个说明. 操作: 1.通过DDMS(Dalvik Debug Monitor Servic ...

  2. telnet IP 端口 的作用

    测试远程服务器的端口是否开启

  3. # Host xx.xxx.x.xxx found: line 1 /root/.ssh/known_hosts updated. Original contents retained as /root/.ssh/known_hosts.old

    一直可以ssh登录远程服务器,突然不行了. 原因:远程服务器最近打过安全补丁,安全标识已经更新. 清理本机的安全密匙即可 解决办法: #ssh-keygen -R "需要远程服务器ip地址& ...

  4. PicGo+Gitee(码云)中的404错误解决方案

    今天在用PicGo配置Gitee时,出现了404问题,记录一下解决方案. 安装与配置 PicGo默认是不支持Gitee的,只能通过安装插件来进行支持.我这里安装的插件是Gitee. 在图床设置---& ...

  5. SpringCloud 2020.0.4 系列之 Bus

    1. 概述 老话说的好:会休息的人才更会工作,身体是革命的本钱,身体垮了,就无法再工作了. 言归正传,之前我们聊了 SpringCloud 的 分布式配置中心 Config,文章里我们聊了config ...

  6. Canvas 放烟花合集 -- 用粉丝头像做成烟花绽放🧨

    "我对着烟花许愿,希望你永远在我身边" "凑不够满天星辰那就去看看烟花吧,人间烟火气,最抚凡人心" 小tips:喜欢的可以关注博主私信代码噢~ 也可以看看前面两 ...

  7. Swift进阶-内存管理

    本文的主要目的是探索 RefCount 的内存结构及强/弱引用计数管理 Swift 中也是采用 ARC 编译器自动内存管理机制. Swift 对象的内存结构是 HeapObject, 有两个属性 Me ...

  8. 用 Python 修改微信(支付宝)运动步数,轻松 TOP1

    用 Python 修改微信(支付宝)运动步数,轻松 TOP1 项目意义 如果你想在支付宝蚂蚁森林收集很多能量种树,为环境绿化出一份力量,又或者是想每天称霸微信运动排行榜装逼,却不想出门走路,那么该py ...

  9. 手把手教你学Dapr - 5. 状态管理

    上一篇:手把手教你学Dapr - 4. 服务调用 介绍 使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中. 您的应用程序可以使用 Dapr 的状态管理 API 使用状态存储组件来 ...

  10. springboot利用mock进行junit单元测试,测试controller

    1  spring-boot-starter-test内置mockito,添加pom依赖 <dependency> <groupId>org.springframework.b ...