Git工程开发实践(四)——Git分支管理策略
A successful Git branching model
https://nvie.com/posts/a-successful-git-branching-model/
Git工程开发实践(一)——Git基础
https://blog.51cto.com/9291927/2172454
Git工程开发实践(二)——Git内部实现机制
https://blog.51cto.com/9291927/2173002
Git工程开发实践(三)——Git常用操作
https://blog.51cto.com/9291927/2173507?source=dra
Git工程开发实践(四)——Git分支管理策略
https://blog.51cto.com/9291927/2173509?source=dra
一、Git版本管理的挑战
Git是非常优秀的版本管理工具,但面对版本管理依然有非常大得挑战。工程开发中,开发者彼此的代码协作必然带来很多问题和挑战:
A、如何开始一个Feature开发,而不影响其它Feature?
B、由于很容易创建新分支,分支多了如何管理,时间久了,如何知道每个分支是干什么的?
C、哪些分支已经合并回了主干?
D、如何进行Release的管理?开始一个Release的时候如何冻结Feature, 如何在Prepare Release的时候,开发人员可以继续开发新的功能?
E、生产线上代码出现Bug,如何快速修复?而且修复的代码要包含到开发人员的分支以及下一个Release?
大部分开发人员使用Git一般使用三个甚至两个分支,一个是Master,一个是Develop,还有一个基于Develop的各种分支。在项目规模小的时候勉强可以支撑,但如果开发人员较多,而且项目周期过长就会出现各种问题。
在Git进行源码管理实践中,诞生了Git Flow,用于进行Git分支管理。
二、主流分支策略简介
Git主流分支策略有三种:Git Flow、GitHub Flow、TBD。
Git Flow是应用最广的Git分支管理实践。
GitHub Flow主要应用于GitHub代码托管工具中。
https://guides.github.com/introduction/flow/
Trunk based development
TBD(Trunk-based development),是单主干的分支实践,在SVN 中比较流行。
https://trunkbaseddevelopment.com/alternative-branching-models/
每个开发团队都应该根据团队自身和项目的特点来选择最适合的分支实践。首先是项目的版本发布周期。如果发布周期较长,则Git-Flow是最好的选择。Git-Flow可以很好地解决新功能开发、版本发布、生产系统维护等问题;如果发布周期较短,则TBD和GitHub
Flow都是不错的选择。GitHub Flow的特色在于集成了Pull Request和代码审查。如果项目已经使用GitHub,则GitHub
Flow是最佳的选择。GitHub Flow和TBD对持续集成和自动化测试等基础设施有比较高的要求。
三、Git Flow简介
Git Flow是构建在Git上的一个组织软件开发活动的源码管理的模型,是一套使用Git进行源代码管理时的行为规范和简化部分Git操作的工具,是在Git上构建的一项源码管理最佳实践。
Git Flow通过利用Git创建和管理分支的能力,为每个分支设定具有特定的含义名称,并将软件生命周期中的各类活动归并到不同的分支上,实现了软件开发过程不同操作的相互隔离。
软件开发模型常见的有瀑布模型、迭×××发模型、敏捷开发模型等不同的模型,每种模型有各自应用场景。Git Flow重点解决的是由于源代码在开发过程中的各种冲突导致开发活动混乱的问题。因此,Git flow可以很好的与各种现有开发模型结合使用。
Git Flow分支模型资料如下:
https://nvie.com/posts/a-successful-git-branching-model/
四、Git Flow模型简介
1、Git Flow模型简介

Git Flow模型中定义了主分支和辅助分支两类分支,其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织用于解决特定的问题而进行的各种开发活动。
2、主分支
主分支是所有开发活动的核心分支。所有的开发活动产生的输出物最终都会反映到主分支的代码中。主分支分为master分支和develop分支。
A、master分支
通常,master分支只能从其它分支合并,不能在master分支直接修改。master分支上存放的是随时可供在生产环境中部署的代码(Production
Ready
state)。当开发活动到一定阶段,产生一份新的可供部署的代码时,master分支上的代码会被更新。同时,每一次更新,最好添加对应的版本号标签(TAG)。
所有在Master分支上的Commit应该打Tag。
B、develop分支
a、develop分支是保持当前开发最新成果的分支,一般会在此分支上进行晚间构建(Nightly Build)并执行自动化测试。
b、develop分支产生于master分支, 并长期存在。
c、当一个版本功能开发完毕且通过测试功能稳定时,就会合并到master分支上,并打好带有相应版本号的tag。
d、develop分支一般命名为develop
develop分支是主开发分支,包含所有要发布到下一个Release的代码,主要合并其它分支,比如Feature分支。
3、辅助分支
辅助分支是用于组织解决特定问题的各种软件开发活动的分支。辅助分支主要用于组织软件新功能的并行开发、简化新功能开发代码的跟踪、辅助完成版本发布工作以及对生产代码的缺陷进行紧急修复工作。辅助分支通常只会在有限的时间范围内存在。
辅助分支包括用于开发新功能时所使用的feature分支,用于辅助版本发布的release分支,用于修正生产代码中的缺陷的hotfix分支。
辅助分支都有固定的使用目的和分支操作限制。通过对分支的命名,定义了使用辅助分支的方法。
A、feature分支
feature分支使用规范:
a、可以从develop分支发起feature分支。
b、代码必须合并回develop分支。
c、feature分支的命名可以使用除master,develop,release-*,hotfix-*之外的任何名称。
feature分支(topic分支)通常在开发一项新的软件功能的时候使用,分支上的代码变更最终合并回develop分支或者干脆被抛弃掉(例如实验性且效果不好的代码变更)。
一般而言,feature分支代码可以保存在开发者自己的代码库中而不强制提交到主代码库里。
Feature分支开发完成后,必须合并回Develop分支,合并完分支后一般会删Feature分支,但也可以保留。
B、release分支
release分支使用规范:
a、可以从develop分支派生;
b、必须合并回develop分支和master分支;
c、分支命名惯例:release-*;
release分支是为发布新的产品版本而设计的。在release分支上的代码允许做测试、bug修改、准备发布版本所需的各项说明信息(版本号、发布时间、编译时间等)。通过在release分支上进行发布相关工作可以让develop分支空闲出来以接受新的feature分支上的代码提交,进入新的软件开发迭代周期。
当develop分支上的代码已经包含了所有即将发布的版本中所计划包含的软件功能,并且已通过所有测试时,可以考虑准备创建release分支。而所有在当前即将发布的版本外的业务需求一定要确保不能混到release分支内(避免由此引入一些不可控的系统缺陷)。
成功的派生release分支并被赋予版本号后,develop分支就可以为下一个版本服务。版本号的命名可以依据项目定义的版本号命名规则进行。
发布Release分支时,合并Release到Master和Develop, 同时在Master分支上打个Tag记住Release版本号,然后就可以删除Release分支。
C、hotfix分支
hotfix分支使用规范:
a、可以从master分支派生;
b、必须合并回master分支和develop分支;
c、分支命名惯例:hotfix-*;
hotfix分支是计划外创建的,可以产生一个新的可供在生产环境部署的软件版本。
当生产环境中的软件遇到异常情况或者发现了严重到必须立即修复的软件缺陷时,就需要从master分支上指定的TAG版本派生hotfix分支来组织代码的紧急修复工作。优点是不会打断正在进行的develop分支的开发工作,能够让团队中负责新功能开发的人与负责代码紧急修复的人并行的开展工作。
hotfix分支基于Master分支创建,开发完后需要合并回Master和Develop分支,同时在Master上打一个tag。
五、Git Flow工程实践的意义
Git Flow开发模型从源代码管理角度对通常意义上的软件开发活动进行了约束,为软件开发提供了一个可供参考的管理模型。Git
Flow开发模型让代码仓库保持整洁,让小组各个成员之间的开发相互隔离,能够有效避免处于开发状态中的代码相互影响而导致的效率低下和混乱。
为了简化使用Git Flow模型时Git指令的复杂性,nvie开发出了一套git增强指令集,可以运行于Windows、Linux、Unix和Mac操作系统下。
https://github.com/nvie/gitflow
Git Flow工具是一套工具命令集,是对Git命令的封装,其命令如下:
git flow init
git flow feature start xxx
git flow feature finish xxx
git flow release start 0.1.xx
git flow release finish 0.1.xx
git flow hotfix start xxx
git flow hotfix finish xxx
使用Git Flow工具只需要两个命令即可完成Git Flow分支管理。如果使用Git命令,对开发者来说足够繁琐。
六、Git Flow分支管理应用示例
1、创建develop分支
git branch develop
git push -u origin develop
2、开始新Feature开发
git checkout -b some-feature develop
# Optionally, push branch to origin:
git push -u origin some-feature
git status
git add some-file
git commit
3、完成Feature
git pull origin develop
git checkout develop
git merge --no-ff some-feature
git push origin develop
git branch -d some-feature
git push origin --delete some-feature
4、开始Release
git checkout -b release-0.1.0 develop
# Optional: Bump version number, commit
# Prepare release, commit
5、完成Release
git checkout master
git merge --no-ff release-0.1.0
git push
git checkout develop
git merge --no-ff release-0.1.0
git push
git branch -d release-0.1.0
# If you pushed branch to origin:
git push origin --delete release-0.1.0
git tag -a v0.1.0 master
git push --tags
6、开始Hotfix
git checkout -b hotfix-0.1.1 master
7、完成Hotfix
git checkout master
git merge --no-ff hotfix-0.1.1
git push
git checkout develop
git merge --no-ff hotfix-0.1.1
git push
git branch -d hotfix-0.1.1
git tag -a v0.1.1 master
git push --tags
Git工程开发实践(四)——Git分支管理策略的更多相关文章
- git学习笔记(四)—— 分支管理
一.创建与合并分支 git branch //查看分支 git branch <name> //创建分支 git checkout <name> //切换分支 git chec ...
- git——学习笔记(三)分支管理
一.创建.合并分支 每次提交,git都往后走一格,串成一跳时间线,head指向的是分支,分支指向提交.master是主分支,dev是另一条分支,分支就像指针一样,合并.删除分支时,修改的都是指针,工作 ...
- 五、git学习之——分支管理策略、Bug分支、feature分支、多人协作
一.分支管理策略 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就会在merge时生 ...
- Git 分支管理策略汇总
原文链接: Git 分支管理策略 最近,团队新入职了一些小伙伴,在开发过程中,他们问我 Git 分支是如何管理的,以及应该怎么提交代码? 我大概说了一些规则,但仔细想来,好像也并没有形成一个清晰规范的 ...
- Git学习笔记(5)——分支管理
本文主要记录了分支的原理.分支的创建,删除,合并.以及分支的使用策略. 分支在实际中的作用 假设你准备开发一个新功能,但是需要两周才能完成,第一周你写了50%的代码,如果立刻提交,由于代码还没写完,不 ...
- Git 分支管理策略
分支管理策略 下面我们来说一下一般企业中开发一个项目的分支策略: 主分支 master 开发分支 develop 功能分支 feature 预发布分支 release bug 分支 fixbug 其 ...
- git分支管理之分支管理策略
分支管理策略 阅读: 246888 通常,合并分支时,如果可能,Git会用Fast forward模式,但这种模式下,删除分支后,会丢掉分支信息. 如果要强制禁用Fast forward模式,Git就 ...
- 01 . Git常用命令及方法和分支管理
原理 # Workspace:工作区 # Index / Stage:暂存区 # Repository:仓库区(或本地仓库) # Remote:远程仓库 本地分支关联远程 git branch --s ...
- SVN分支管理策略个人见解
本篇目录 前言 SVN分支管理策略 VisualSVN Server TortoiseSVN客户端 Repository的创建 Check out trunk创建新项目MyProject trunk更 ...
随机推荐
- 洛谷P1198 [JSOI2008]最大数(单点修改,区间查询)
洛谷P1198 [JSOI2008]最大数 简单的线段树单点问题. 问题:读入A和Q时,按照读入一个字符会MLE,换成读入字符串就可以了. #include<bits/stdc++.h> ...
- Deepin 系统下设置Apache虚拟主机站点
1,在 var/www/html 文件夹中创建一个文件夹,命名为 a ,用来作为我们的PHP项目文件夹. 2,找到 etc/apache2/sites-available 文件夹,在文件夹中创建一个站 ...
- RF通过命令执行用例及自定义报告与日志的位置
1.执行整个项目下的所有用例: pybot 项目路径.例如: pybot D:\robotPS:robot项目里面所有用例 2.执行某个suit中的所有用例: pybot 项目路径\suit文件名称. ...
- 转 HTTP请求报文格式 GET和POST
https://blog.csdn.net/h517604180/article/details/79802914 最近在做安卓客户端图片上传插件功能,供后台调用.其中涉及到了拼接HTTP请求报文,所 ...
- leetcode 441.排列硬币(python)
1.题目描述 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币. 给定一个数字 n,找出可形成完整阶梯行的总行数. n 是一个非负整数,并且在32位有符号整型的范 ...
- npm link的作用
语法: 1. 在一个包目录下npm link (把当前的包目录软连接到global folder里面,把二进制文件也软连接到global的bin里面 这个prefix可以用npm config ls ...
- 2019暑假第二周(hadoop在个人电脑上的搭建)
一,Hadoop和NoSQL数据库的学习,大多需要Linux环境. 搭建Linux环境可以分为两种方式: (1)在电脑上安装双操作系统,即同时安装Linux和Windows操作系统,在电脑启动的时候, ...
- Java课堂疑问解答与思考4
一. 请运行以下示例代码StringPool.java,查看其输出结果.如何解释这样的输出结果?从中你能总结出什么? 答:定义的三个字符串如果相等,系统自动创建一个,并调用这个,对于由new创建的字符 ...
- 一个简单的dns服务器
options { listen-on port 53 { any; }; listen-on-v6 port 53 { any; }; directory "/srv/app/named& ...
- JavaSE_Java跨平台原理
Java语言的核心优势就是跨平台. C/C++语言都是直接编译成针对特定平台的机器码,如果要跨平台,需要借用相应的编译器重新编译.Java源程序(.java)要先编译成与平台无关的字节码文件(.cla ...