基于git的源代码管理模型——git flow

说明: 本文以nvie的“a successful git branching model”为蓝本,结合我个人理解写成。如有谬误,还请各位指出。多谢!

Note: This article is highly based on nvie's a successful git branching model. Thanks nvie.

Git Flow 是什么

Git Flow是构建在Git之上的一个组织软件开发活动的模型,是在Git之上构建的一项软件开发最佳实践。Git Flow是一套使用Git进行源代码管理时的一套行为规范和简化部分Git操作的工具。

2010年5月,在一篇名为“一种成功的Git分支模型”的博文中,@nvie介绍了一种在Git之上的软件开发模型。通过利用Git创建和管理分支的能力,为每个分支设定具有特定的含义名称,并将软件生命周期中的各类活动归并到不同的分支上。实现了软件开发过程不同操作的相互隔离。这种软件开发的活动模型被nwie称为“Git Flow”。

一般而言,软件开发模型有常见的瀑布模型、迭代开发模型、以及最近出现的敏捷开发模型等不同的模型。每种模型有各自应用场景。Git Flow重点解决的是由于源代码在开发过程中的各种冲突导致开发活动混乱的问题。因此,Git flow可以很好的于各种现有开发模型相结合使用。

在开始研究Git Flow的具体内容前,下面这张图可以看到模型的全貌(引自nvie的博文):

 

Git Flow中的分支

Git Flow模型中定义了主分支和辅助分支两类分支。其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织为了解决特定的问题而进行的各种开发活动。

主分支

主分支是所有开发活动的核心分支。所有的开发活动产生的输出物最终都会反映到主分支的代码中。主分支分为master分支和development分支。

 

master分支

master分支上存放的应该是随时可供在生产环境中部署的代码(Production Ready state)。当开发活动告一段落,产生了一份新的可供部署的代码时,master分支上的代码会被更新。同时,每一次更新,最好添加对应的版本号标签(TAG)。

develop分支

develop分支是保存当前最新开发成果的分支。通常这个分支上的代码也是可进行每日夜间发布的代码(Nightly build)。因此这个分支有时也可以被称作“integration branch”。

当develop分支上的代码已实现了软件需求说明书中所有的功能,通过了所有的测试后,并且代码已经足够稳定时,就可以将所有的开发成果合并回master分支了。对于master分支上的新提交的代码建议都打上一个新的版本号标签(TAG),供后续代码跟踪使用。

因此,每次将develop分支上的代码合并回master分支时,我们都可以认为一个新的可供在生产环境中部署的版本就产生了。通常而言,“仅在发布新的可供部署的代码时才更新master分支上的代码”是推荐所有人都遵守的行为准则。基于此,理论上说,每当有代码提交到master分支时,我们可以使用Git Hook触发软件自动测试以及生产环境代码的自动更新工作。这些自动化操作将有利于减少新代码发布之后的一些事务性工作。

辅助分支

辅助分支是用于组织解决特定问题的各种软件开发活动的分支。辅助分支主要用于组织软件新功能的并行开发、简化新功能开发代码的跟踪、辅助完成版本发布工作以及对生产代码的缺陷进行紧急修复工作。这些分支与主分支不同,通常只会在有限的时间范围内存在。

辅助分支包括:

  • 用于开发新功能时所使用的feature分支;
  • 用于辅助版本发布的release分支;
  • 用于修正生产代码中的缺陷的hotfix分支。

以上这些分支都有固定的使用目的和分支操作限制。从单纯技术的角度说,这些分支与Git其他分支并没有什么区别,但通过命名,我们定义了使用这些分支的方法。

feature分支

使用规范:

  • 可以从develop分支发起feature分支
  • 代码必须合并回develop分支
  • feature分支的命名可以使用除masterdeveloprelease-*hotfix-*之外的任何名称

feature分支(有时也可以被叫做“topic分支”)通常是在开发一项新的软件功能的时候使用,这个分支上的代码变更最终合并回develop分支或者干脆被抛弃掉(例如实验性且效果不好的代码变更)。

一般而言,feature分支代码可以保存在开发者自己的代码库中而不强制提交到主代码库里。

 

release分支

使用规范:

  • 可以从develop分支派生
  • 必须合并回develop分支和master分支
  • 分支命名惯例:release-*

release分支是为发布新的产品版本而设计的。在这个分支上的代码允许做小的缺陷修正、准备发布版本所需的各项说明信息(版本号、发布时间、编译时间等等)。通过在release分支上进行这些工作可以让develop分支空闲出来以接受新的feature分支上的代码提交,进入新的软件开发迭代周期。

当develop分支上的代码已经包含了所有即将发布的版本中所计划包含的软件功能,并且已通过所有测试时,我们就可以考虑准备创建release分支了。而所有在当前即将发布的版本之外的业务需求一定要确保不能混到release分支之内(避免由此引入一些不可控的系统缺陷)。

成功的派生了release分支,并被赋予版本号之后,develop分支就可以为“下一个版本”服务了。所谓的“下一个版本”是在当前即将发布的版本之后发布的版本。版本号的命名可以依据项目定义的版本号命名规则进行。

hotfix分支

使用规范:

  • 可以从master分支派生
  • 必须合并回master分支和develop分支
  • 分支命名惯例:hotfix-*

除了是计划外创建的以外,hotfix分支与release分支十分相似:都可以产生一个新的可供在生产环境部署的软件版本。

当生产环境中的软件遇到了异常情况或者发现了严重到必须立即修复的软件缺陷的时候,就需要从master分支上指定的TAG版本派生hotfix分支来组织代码的紧急修复工作。

这样做的显而易见的好处是不会打断正在进行的develop分支的开发工作,能够让团队中负责新功能开发的人与负责代码紧急修复的人并行的开展工作。

 

更进一步

Git Flow开发模型从源代码管理角度对通常意义上的软件开发活动进行了约束。应该说,为我们的软件开发提供了一个可供参考的管理模型。Git Flow开发模型让nvie的开发代码仓库保持整洁,让小组各个成员之间的开发相互隔离,能够有效避免处于开发状态中的代码相互影响而导致的效率低下和混乱。

所谓模型,在不同的开发团队,不同的文化,不同的项目背景情况下都有可能需要进行适当的裁剪或扩充。祝各位好运!

PS:为了简化使用Git Flow模型时Git指令的复杂性,nvie开发出了一套git增强指令集。可以运行于Windows、Linux、Unix和Mac操作系统之下。有兴趣的同学可以去看看。

附录

安装Git Flow

Git Flow的在不同的操作系统之下有一些轻微的不同。好在nvie给出了详细的指导。

Windows

配合Cygwin使用。Cygwin之下的安装非常简单。执行如下指令即可:

wget -q -O - --no-check-certificate https://github.com/nvie/gitflow/raw/develop/contrib/gitflow-installer.sh | bash

使用这条命令在大多数情况下都可以完成Git Flow的安装。但在少数情况下也会遇到异常:

  • 执行 git flow init 命令后出现错误:"flags: FATAL unable to determine getopt version"

    需要使用Cygwin的Util-linux安装包。重新使用cywgin的setup安装吧。

  • 如果出现类似"$'\r': command not found"的错误,则可能是换行符出现了问题。可以使用sed命令来快速解决。

$ sed -i 's/\n\r/\n/mg' /usr/local/bin/git-flow*
$ sed -i 's/\n\r/\n/mg' /usr/local/bin/gitflow-*

 

来自:http://www.ituring.com.cn/article/56870

时间: 2024-09-30 01:09:24

基于git的源代码管理模型——git flow的相关文章

git分支管理模型推荐

前言 正如我了解到的,很多基于SVN的分支管理,类似如下的流程: 可能存在的问题: master合并成本比较高 特性分支有开发公共功能的需求, 需要及时合并 如下是一个比较成功的分支策略和发布管理,原文链接,另外,建议大家用sourceTree进行git的分支管理,因为上面的Git Flow就是如下图所示的管理流程.看图说明一切,然后使用一下sourceTree的git flow基本就懂了. 关注点是围绕着将git作为源码版本管理的工具,另外,如果你对git很感兴趣,可以关注下作者公司(gitp

github-VS2013 git 源代码管理

问题描述 VS2013 git 源代码管理 "无法将本地分支 master 发布到远程存储库 origin,因为此处已存在具有同一名称的分支.您可能需要重命名您的本地分支,然后重试." 出现了这个错误,虽然我重命名分支后成功了,但是仍然存在疑问.我想要更新master分支怎么弄?难道我每次更改代码都要新建一个分支? (我github 新手) 解决方案 同遇到过这样的问题,不知道朋友的问题是不是已经解决了,我的分析和解决方式如下,多多指教: 因为github新建项目的时候选中了初始化选项

Git~GitLab当它是一个源代码管理工具时

最近开始接触和使用GitLab,用它来做源代码的版本控制,CI.CD持续集成和持续交付,感觉功能确实很强大,今天也只能先说一下它的源代码管理功能,核心就是GIT,对GIT进行了封装,提供了一些扩展功能,事实上GitLab类似于GitHub,都是以Git以基础的! 下面我们来看一个场景,首先你在GitLab上建立了一个Project,然后本地有对应的项目,希望把本地现有的项目迁入到GitHub上,主要分为以下几个步骤: 一 在远程建立一个仓库,它有https和ssh的地址 二 本地建立仓库文件夹

Git详解之三:Git分支

原文链接:http://blog.jobbole.com/25877/ 原文:<Pro Git> Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的完整副本,对大型项目来说会花费很长时间.(伯乐在线注:如果你对Git还不了解,建议从本Git系列第一篇文章开始阅读) 有人把 Git 的分支模型称为"必杀技特性",而正是因为它,将

android Git命令家底儿及Git数据通信原理详解

声明:本文为CSDN原创投稿文章,未经许可,禁止任何形式的转载.        现在大部分使用的都是SVN,也有一部分迁移了Git,虽然挺好的,不过还有其它很多版本控制的工具,并没有谁最好用,最重要的是适合自己的公司与团队,效率和团队是成正比了,重要的不是武器,虽然武器也挺重要的,不过最重要的还是配"剑"者,不过要是对Git没接触过或者认识不够的话,我想,这篇"华序"写的文章足以让你对Git有所认识了,不过了解下就可以了,凡事不要太执着了,下面,就让我们进入正文吧.

金山快盘的Git服务器、快盘+ Git GUI 实现代码版本管理

  Git,这货堪称神器,用了它就再也不想用其他VCS了,就像上了高速就不想再走国道一样. Git的强大之处在于,你可以在局域网内的任何一个共享路径下创建仓库,而不需要运行任何服务.所有的操作都是基于本地的.这也不难理解可以直接放在快盘里了. 一般的大些公司都有自已的版本管理服务器,远程时 登录VPN也可以实现操,但是几人的小团队就不太现实了,基本没有VPN,如果是几个异地朋友想凑在一起创业,就 只能买台服务器做版本管理服务器,这个第一想到成本,对于几个人来说一台服务器一年的成本也不是小数,还

新的RBAC:基于资源的权限管理(Resource-Based Access Control)

本文讨论以角色概念进行的权限管理策略及主要以基于角色的机制进行权限管理是远远不够的.同时将讨论一种更好的权限管理方式. What is a Role? 什么是角色 当说到程序的权限管理时,人们往往想到角色这一概念.角色是代表一系列行为或责任的实体,用于限定你在软件系统中能做什么.不能做什么.用户帐号往往与角色相关联,因此,一个用户在软件系统中能"做"什么取决于与之关联的各个角色. 例如,一个用户以关联了"项目管理员"角色的帐号登录系统,那这个用户就可以做项目管理员能

Git详解之一:Git起步

原文:http://blog.jobbole.com/25775/ 起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git 会如此流行,为什么你应该立即开始使用它.(查看Git详解系列的全部文章) 1.1 关于版本控制 什么是版本控制?我真的需要吗?版本控制是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统.在本书所展示的例子中,我们仅对保存

源代码管理十诫

英文原文:The 10 commandments of good source control management,翻译:图灵社区周庆成 若是还有可以毫无偏见地涉及各个编程语言,比源代码管理软件更必要的工具,我倒是很想见识一下.源代码管理软件是我们工作的必备工具,是许多开发团队的血液.那为什么我们都会对它有所误解呢?为什么都很难理解版本控制系统的核心价值和基本原理呢? 我总结出10条惯例--如果你愿意也可以用"戒律"--意味着必须服从它而且从一开始很难去理解.它们与所有类型编程语言的