• 简介

  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. cf14C Four Segments(计算几何)

    题意: 给四个线段(两个端点的坐标). 判断这四个线段能否构成一个矩形.(矩形的四条边都平行于X轴或Y轴) 思路: 计算几何 代码: class Point{ public: int x,y; voi ...

  2. JAVA笔记12__字节、字符缓冲流/打印流/对象流/

    /** * !!:以后写流的时候一定要加入缓冲!! * 对文件或其它目标频繁的读写操作,效率低,性能差. * 缓冲流:好处是能更高效地读写信息,原理是将数据先缓冲起来,然后一起写入或读取出来. * * ...

  3. 【linux命令】 磁盘管理

    du du是查看硬盘的使用情况,统计文件或目录的空间大小. -a 显示所有目录或文件的大小 -b 以byte为单位,显示目录或文件的大小 -c 显示目录或文件的总和 -k 以KB为单位输出 -m 以M ...

  4. Linux&C open creat read write lseek 函数用法总结

    一:五个函数的参数以及返回值. 函数                                 参数                      返回值     open (文件名,打开方式以及读 ...

  5. MapReduce Service更换集群外部时钟源,仅需10步

    摘要:MapReduce Service 集群使用NTP进行时钟同步.本文简要介绍了MapReduce Service集群NTP机制及NTP的配置方式. 本文分享自华为云社区<MapReduce ...

  6. Java 代码执行流程

    Java 代码执行流程 类加载过程 加载 -> 验证 -> 准备 -> 解析 -> 初始化 -> 使用 -> 卸载 类加载时机:代码使用到这个类时 验证阶段 &qu ...

  7. SpringCloud升级之路2020.0.x版-37. 实现异步的客户端封装配置管理的意义与设计

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 为何需要封装异步 HTTP 客户端 WebClient 对于同步的请求,我们使用 spri ...

  8. 【Microsoft Azure 的1024种玩法】三.基于Azure云平台构建Discuz论坛

    [简介] Discuz!是一套通用社区论坛软件系统,用户在不需要任何编程的基础上,通过简单的设置和安装,在互联网上搭建起具备完善功能.很强负载能力和可高度定制的论坛服务. [前期文章] [操作步骤] ...

  9. 如何找到mysql磁盘地址

    show global variables like "%datadir%"; 我的位置: C:\ProgramData\MySQL\MySQL Server 5.5\Data\

  10. 从零开始学Kotlin第六课

    Kotlin调用java代码: 1.如果是内部工程的类,直接调用,如果是外部的工程项目按照java的方式将jar包导入进来. 2.实例化java对象 我们之前学java的时候实例化对象是这个样子的. ...