Git 与 Maven:企业级版本管理与版本控制规范设计
一、背景
当今,许多开发人员熟悉 GitFlow 工作流程,但往往忽略了 GitFlow 如何与 Maven 版本控制结合,尤其是在管理 snapshot 和 release 版本时的最佳实践。本文旨在整合 GitFlow 工作流程与 Maven 版本管理,提出一个统一的企业级规范,以供开发人员参考。
GitFlow 是一种流行的分支管理模型,它定义了一套适用于软件开发的分支管理策略。然而,在 GitFlow 的基础上结合 Maven 版本控制,特别是在管理版本号中的 snapshot 和 release 的过程中,需要更深入的理解和实践。
在本文中,我们将探讨如何在 GitFlow 工作流程中结合 Maven 版本控制,以实现更高效、更有条理的版本管理。
二、GitFlow
2.1、介绍
Gitflow 是一种基于 Git 版本控制系统的分支管理模型,旨在帮助团队更有效地管理项目的开发和发布流程。它提供了一种结构化的分支管理策略,以支持并行开发、功能开发、版本控制和发布管理,如下图:

2.2、主要特点
- 分支模型:
- 主要分支:
- master 分支:代表生产环境的稳定版本,只能接收已经经过测试并准备发布的代码。
- develop 分支:作为开发的主分支,包含了最新的开发代码,通常用于集成各个功能分支。
- 支持分支:
- feature 分支:用于开发新功能,通常从 develop 分支创建,完成后合并回 develop 分支。
- release 分支:用于发布准备,从 develop 分支创建,用于测试、修复缺陷和准备发布,最终合并回 master 和 develop 分支。
- hotfix 分支:用于紧急修复生产环境中的问题,从 master 分支创建,完成后合并回 master 和 develop 分支。
- 主要分支:
- 特点:
- 并行开发:允许团队并行开发多个功能,每个功能都有自己的独立分支。
- 版本控制:将开发、测试和发布过程清晰地区分开来,便于版本控制和管理。
- 稳定性:通过严格的分支策略和版本控制,保证了生产环境代码的稳定性和可靠性。
![![ref1]](https://img-blog.csdnimg.cn/a3d448f79c2a4f2eb440a41f393377c7.png)
2.3、抽象模型图

2.4、注意事项
- 创建release分支的关键条件是:当develop(几乎)反映新发布的期望状态时。至少所有针对新版本的特性都必须在这个时间点被合并到开发中!
- 所有针对未来发行版[下个迭代]的特性可能都不需要提交,它们必须等到发行版分支被划分出来之后。
- 混淆点:混淆之处在于 Maven 中的 release 版本号和 Git 中的 release 分支并非完全相等。在 Maven 中,release 版本号代表着一个稳定的版本;而在 Git 中,release 分支通常是用于提测的分支,只有合并到 master 分支之后才会成为稳定版本。
- 因此,尽管 Maven 中的 release 版本号表示项目的稳定版本,但是 Git 中的 release 分支却更多地被用作为预发布或提测的环节。只有当 release 分支的代码合并到了 master 分支之后,代码才会成为最终的稳定版本。
三、Maven版本管理
3.1、介绍
Maven 是一个流行的项目管理和构建工具,它采用一种版本管理规范来管理项目的版本。Maven 版本管理涉及到管理项目的版本号、依赖和构建过程。
开发同学需要清晰区分版本管理(Version Management)和版本控制(Version Control)。版本管理指的是项目整体版本的演变过程管理,涵盖了版本号的分配、版本迭代和发布等方面。它主要关注项目整体发展历程的控制和管理。
版本控制(Version Control),则是指在软件开发过程中追踪和管理文件的变化,对这些变化进行记录和控制的过程【主要通过git】。它主要关注单个文件或代码的变更、追踪历史记录以及团队成员之间的协作与版本冲突解决。
3.2、版本管理规范
Maven 版本管理通常遵循以下几个方面:
- 版本号格式:通常使用 <主版本>.<次版本>.<修订版本>-<里程碑版本>的格式。例如,1.0.0-SNAPSHOT,其中:
- 主版本号表示 API 的兼容性变化。
- 次版本号表示向后兼容的功能性增强。
- 修订版本号表示对现有功能的小改动或 bug 修复。
- 里程碑版本号表示特定构建的唯一标识符,如 SNAPSHOT、RELEASE、beta 等。
- SNAPSHOT 版本:代表正在开发中的版本,是一个不稳定、未发布的版本。SNAPSHOT 版本在开发过程中允许持续更新和部署,通常用于持续开发和测试阶段。
- RELEASE版本:代表一个稳定的、可发布的版本。Release 版本是经过测试并被认为足够稳定的版本,不包含 SNAPSHOT 标识,可以发布和部署。
3.3、抽象模型图

3.3、注意事项
在 Maven 中,当版本号中包含 -SNAPSHOT 时,它代表的是开发中的版本,可能会发生变化,因此 Maven 在构建项目时会根据当前的时间戳动态生成一个唯一的版本号,这有助于标识快照版本的不同构建。每次构建快照版本时,Maven 会在生成的构件名称中包含时间戳。
举例来说,假设项目版本号为 1.0.0-SNAPSHOT,每次运行 mvn package 或其他构建命令时,Maven 将生成的构件名称类似于 project-1.0.0-20231123.091532-1.jar,其中 20231123.091532 是时间戳,1 是构建的序列号。这种构建命名方案确保了每个快照构建都有一个唯一的标识符。
相反,当版本号中没有 -SNAPSHOT(例如 1.0.0 或 2.1.3.RELEASE)时,Maven 认为这是一个发布(release)版本,这表示它是一个稳定的、不会变化的版本。在这种情况下,Maven 只会生成一个构件,并使用指定的版本号,而不会在构件名称中加入时间戳。
四、企业设计方案
4.1、主要特点
- GitFlow:包括团队如何使用 Git 进行版本控制的最佳实践,例如分支策略、提交信息规范、代码审查流程等。
- Maven 集成:如何结合 Maven 进行版本控制,讨论 SNAPSHOT 和 RELEASE 版本的管理,以及版本号的规范。
- 标准开发流程 及 hotfix开发流程
4.2、标准流程
![![ref1]](https://img-blog.csdnimg.cn/32b4da0a24994a5595e2628fe154f5d5.png)
4.3、Hotfix流程
![![ref1]](https://img-blog.csdnimg.cn/b87d0db13f984cf4bfe4191843f6909e.png)
4.4、总结
通过结合 GitFlow 的分支管理和Maven 的项目构建和依赖管理,企业可以实现更可控、可追踪和可维护的代码管理方案,提高团队协作效率和代码质量。
五、相关文档
- GitFlow官方指导
相关文章:
Git 与 Maven:企业级版本管理与版本控制规范设计
一、背景 当今,许多开发人员熟悉 GitFlow 工作流程,但往往忽略了 GitFlow 如何与 Maven 版本控制结合,尤其是在管理 snapshot 和 release 版本时的最佳实践。本文旨在整合 GitFlow 工作流程与 Maven 版本管理,提出一个统一的企业…...
Springmvc原理解析
1. DispatcherServlet springmvc的核心控制器,负责截获所有的请求,当截获请求后委托给HandlerMapping进行请求映射的解析工作,目的是找到哪一个Controller的方法可以处理该请求,找到后再交由给HandlerAdaptor去负责调用并返回Mod…...
Retrofit怎么返回一个JSON字符串?
项目用已经使用了 Retrofit,定义了接口方法,返回了 JSON 转换后的实体对象,炒鸡方便。但是总有意料之外的时候,比如我不需要返回实体对象,我要返回纯纯的 JSON 字符串,怎么办呢? 先看源码 通过…...
【GCC】2:chatgpt:SendSideBandwidthEstimation
webrtc中SendSideBandwidthEstimation类的设计 The SendSideBandwidthEstimation class in WebRTC is a critical component in its video engine. It’s responsible for deciding the video traffic rate that can be sent without overloading the network and thus maintai…...
OpenGL 自学总结
前言: 本人是工作后才接触到的OpenGL,大学找工作的时候其实比较着急,就想着尽快有个着落。工作后才发现自己的兴趣点。同时也能感觉到自己当前的工作有一点温水煮青蛙的意思,很担心自己往后能力跟不上年龄的增长。因此想在工作之余…...
java集合,ArrayList、LinkedList和Vector,多线程场景下如何使用 ArrayList
文章目录 Java集合1.2 流程图关系1.3 底层实现1.4 集合与数组的区别1.4.1 元素类型1.4.2 元素个数 1.5 集合的好处1.6 List集合我们以ArrayList集合为例1.7 迭代器的常用方法1.8 ArrayList、LinkedList和Vector的区别1.8.1 说出ArrayList,Vector, LinkedList的存储性能和特性1.…...
【2023.11.26】Mybatis自定义映射规则学习
创建自定义映射规则 <select id"selectArtist" resultMap"test">select * from artist </select> 在SQL语句标签中将resultType修改为resultMap,即自定义映射的id。 编写自定义映射规则: <resultMap id"tes…...
Nginx(九) aio sendfile directio 组合使用测试(2)
测试7:开启directio2m、sendfile,关闭aio,请求/vendor.js {"time_iso8601":"2023-11-26T22:47:3508:00","request_uri":"/vendor.js","status":"200","bytes_sent":…...
使用ETLCloud实现CDC实时数据集成:从MySQL到ClickHouse的实时数据同步
背景 在上一篇文章中体验了 ETLCloud 的离线数据迁移功能,就像大数据领域里有离线计算和实时计算, ETLCloud 还提供了基于 CDC (Change Data Capture)的实时数据集成功能:实时数据集成是指通过变化数据捕获技术&#…...
【云平台】STM32微信小程序阿里云平台学习板
【云平台】STM32微信小程序阿里云平台学习板 文章目录 前言一、立创EDA(硬件设计)1.主控STM32F103C8T62.ESP8266模块3.温湿度模块4.光照强度模块5.OLED显示模块6.PCB正面7.PCB反面8.3D视角正面9.3D视角反面 二、【云平台】STM32微信小程序阿里云平台学习…...
【研究中2】sql server权限用户设置
--更新时间2023.11.26 21:30 负责人:jerrysuse DBAliCMSIF EXISTS (select * from sysobjects where namehkcms_admin)--判断是否存在此表DROP TABLE hkcms_adminCREATE TABLE hkcms_admin (id int identity(1, 1),--id int primary key identity…...
从零开始学习管道:管道程序的优化和文件描述符继承问题
📟作者主页:慢热的陕西人 🌴专栏链接:Linux 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容管道后续的完善,以及解决管道继承多个文件描…...
【JavaWeb】HTMLCSSJavaScript
HTML&CSS&JavaScript 文章目录 HTML&CSS&JavaScript一、开发工具及在线帮助文档二、 HTML2.1 HTML&CSS&JavaScript的作用2.2 HTML基础结构2.3 HTML概念词汇解释2.4 HTML的语法规则2.5 常用标签 三、CSS3.1 引入方式3.2 CSS选择器3.3 CSS浮动3.4 CSS定位…...
如何在没有备份的情况下恢复 iPhone 上已删除的短信
要在没有备份的情况下恢复 iPhone 上已删除的消息,您可以从“消息”应用程序恢复它们或使用第三方数据恢复工具。 虽然我们的 iPhone 可以做很多事情,但我在设备上最常做的事情之一就是文本。无论我是与朋友或家人联系,还是分享重要信息&…...
tomcat-pass-getshell 弱口令 漏洞复现
tomcat-pass-getshell 弱口令 漏洞复现 名称: tomcat-pass-getshell 弱口令 描述: Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。 通过弱口令登…...
利用 LD_PRELOAD 环境变量
文章目录 原理LD_PRELOAD介绍如何上传.so文件 例题 [虎符CTF 2022]ezphp 原理 LD_PRELOAD介绍 LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接…...
黑马点评-Feed流的实现方案,基于推拉结合模式实现笔记推送
Feed流实现方案 我们关注了博主之后,当用户发布了动态后我们应该把这些数据推送给粉丝,关注推送也叫作Feed(投喂)流,通过无限下拉刷新获取新的信息 传统的模式内容检索: 粉丝需要主动通过搜索引擎或者是其他方式去查找想看的内容新型Feed流的效果: 系统分析用户到底想看什么,…...
Re53:读论文 How Can We Know What Language Models Know?
诸神缄默不语-个人CSDN博文目录 诸神缄默不语的论文阅读笔记和分类 论文名称:How Can We Know What Language Models Know? ArXiv网址:https://arxiv.org/abs/1911.12543 官方GitHub项目(prompt之类的都有):https:…...
YARN工作流程详解
图1 图2 图1 -作业提交阶段: 1、client 提交job,向 ResourceManager【RM】 申请job_id; 2、RM 返回 job_id 及资源提交路径 给 client 3、client 把job所需的资源提交 到 3中指定的路径中 4、client 上传完成资源后,向RM 发送执行作业请求,RM…...
力扣373场周赛题解
第一题: 这个题是一个简单题,数据范围也特别小,所以直接使用模拟方式暴力解答。 直接进行行移动的过程,然后检查移动后的结果是否与移动前相同。 代码: public class Solution {// 将指定行循环右移k次pri…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
HubSpot推出与ChatGPT的深度集成引发兴奋与担忧
上周三,HubSpot宣布已构建与ChatGPT的深度集成,这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋,但同时也存在一些关于数据安全的担忧。 许多网络声音声称,这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
