如何使用简单的分支策略来保护您的 Git 项目
良好的分支策略可以使项目源代码获得一致且安全的数据,所有协作者可以在更短的生命周期内共享和访问这些数据。
您必须以灵活的方式设计项目模型,以便对所有成员角色和权限进行良好的管理。
我要谈论的并没有什么令人惊讶的新鲜事。您可能已经知道一些 git 概念和命令,但我的想法是利用您的思维过程,从您已经了解的 Git 中做出更好的选择。
本文的要点:
您将了解什么 git 工作流程可能适合您当前的项目代码
根据项目开发的代码类型,在不同的并行运行分支上隔离和组织项目代码。
采用灵活的实时分支模型
了解如何使用gitlab (一种云托管的版本控制服务)在分支上设置哪些准则。
使用受保护的分支和策略在 GitLab 上托管您的项目。
简要想法/大纲
根据您的项目模型,Git 既可以充当集中式版本控制系统,也可以充当分散式版本控制系统 (VCS)。正如我们所知,Git 的分布式特性是为了方便大量贡献者同步协作他们的工作而开发的。理想的 git 工作流程模型的选择取决于贡献者的数量、存储库和分支的权限级别层次结构,以及所选的架构模型是集中式还是分散式?
一个理想的分支策略,在实践中应该声明一套指导方针,保护分支免受读写权限,并限制对分支的未经授权的创建、删除、强制推送。
无论您是在Linux 服务器上还是在Web 托管、基于云的源代码控制服务上维护源代码,都可以以结构化方式创建分支并保护它们的某些成员和操作。
我从之前的实时航空公司计费项目中采用的分支模型创建起来非常简单并且易于遵循。管理团队、开发、测试、运营和 QA 团队等不同团队和谐地合作,为项目源代码做出贡献。
Git 分支模型
这种方法让您只有稳定的 QA 批准的提交才能通过压缩合并策略从“ release ”分支推送到“ prod ”分支。“ master_prod ”仅接受来自“ prod ”分支的源代码的最终提交。
主要代码开发发生在功能和主题分支上。
“master_prod”是部署就绪分支。CD 管道可以在此分支上实现自动化,以便在 DevOps 环境设置中进行持续部署。
所需先决知识
我假设你:
了解git 概念和命令,并了解如何使用 git 工作流程开发项目
了解git 分支 — 创建、合并、解决冲突和删除
了解如何将远程存储库添加或克隆到 GitHub 或 GitLab 上的本地项目以发布您的作品。
了解我们为什么、何时以及如何使用 git fetch、pull 和 push 来与远程存储库同步并与协作者协调工作。
一般的思考过程如下:
开发分支模型
决定 VCS 和模型架构的类型
选择 git 工作流程模型
选择分支策略
创建分支并定义准则
定义成员角色和权限
保护 gitlab 上的分支并维护分支指南
VCS 和模型架构类型
所需的版本控制架构取决于您的项目数据、管理设置以及团队规模。在具有许多协作者的大型项目中,必须有灵活的源代码管理 (SCM) 设置。
假设您已经赞成使用 Git,因为它快速、分布式、灵活,具有强大的分支和合并功能,并且保留良好的历史记录,可以让您修复错误并以有组织的方式分析代码; 分布式版本控制系统(DVCS)架构将是您的选择。
在 DVCS 模型中,所有机器既充当“节点”又充当“中心”。然而,在集中式版本控制系统中,每个开发人员仅充当“节点”,而中央服务器充当“集线器”。
如果您的团队有早期集中式 VCS(例如 Subversion、CVS 或 ClearCase)的背景,那么 Git 的集中式工作流程模型很可能会吸引您。
您希望在大型项目中使用 Git 作为 VCS 的另一个原因是维护数据完整性;因为 git 永远不会允许你们覆盖彼此的工作。
每次开发人员尝试将新提交推送到自上次签出以来已经接受其他开发人员提交的中央存储库时;您的推送将被拒绝,因为它不会是快进合并。您必须获取并合并其他人的更改,然后在此基础上进行工作。
这样,许多开发人员就可以通过无数分支和谐地工作,贡献每个人的工作,而无需干涉彼此的更改。
有了这个令人信服的说明,我们将继续为您的项目选择 Git 分布式版本控制系统 (DVCS)。阅读git 3 层架构工作流程可能会感兴趣,以快速介绍 git 工作流程并了解所使用的 git 术语。
选择 Git 工作流程模型
无论您遵循哪种git 工作流程模型,良好的分支策略都会让您更接近稳定的模型。Git 提供了强大、灵活、稳定的工作流程模型,可以轻松地在庞大的团队中进行协作工作。
具有共享存储库模型的Git集中式工作流程为您提供与 SubVersion、ClearCase 或 CVS 版本系统相同的舒适区,同时保持各个贡献者之间的数据完整性。
通过设置集成管理器工作流程,可以在具有多个远程存储库概念的大型项目中实现分布式方法。在这里,每个开发人员都必须对其自己的公共存储库进行写入访问,而对其他人的公共存储库进行只读访问。维护者扮演的主要角色是协作(拉取和合并)每个开发人员的工作到自己的存储库中,并将其发布到主存储库上,然后其他开发人员可以从中克隆。
如果您正在开发一个具有多个远程存储库的大型项目,请选择独裁者和中尉工作流程。工作的协作被分配给拥有存储库的特定部分的各个副官,并且仅合并来自某些开发人员的工作。独裁者被分配来拉取和合并所有副官的更改,最终将所有协作工作发布到主存储库。
----
注意:在选择工作流程模型或模型组合时,考虑将影响实时工作流程的真实场景变量也很重要。
贡献者数量 –> 如何使更改不断更新 - 在进行自己的更改之前首先采用拉动策略。
工作流程 –> 集中式还是分布式?合并前是否对代码进行了审查,是否有合并请求程序可供遵循?
提交访问权限 -> 应在哪个分支上分配哪些读写访问权限?
独裁者和中尉工作流程将是大型项目的理想选择。
选择分支策略
下一步是创建不同的分支并为每个分支分配角色。如果您需要快速了解什么是 git 分支以及如何创建和管理它们;请参阅Git — 模块 3:分支和合并
根据分支用于的代码开发类型,分支可以简单地分类为:
稳定/集成或长期运行的分支- 这些通常具有干净的历史记录,没有三向合并,并且具有较短的用户友好历史记录。在我们的项目示例中,“prod”和“master_prod”是两个这样的稳定分支。
发布分支将所有功能和修补程序分支的更改提交合并为一个。这是验证、审查和解决冲突的地方。(参考:git解决冲突-第6点。合并工具(diffmerge):解决冲突)。
发布分支应该有一个非线性且混乱的提交历史记录,这样可以更容易地列出整个项目的提交历史记录,并分析项目是如何开发的、哪些提交是由谁创建的以及进行了哪些更改。
功能分支从主开发分支(更常见的是“主”分支)分支出来。这用于开发人员开发特定代码。这些是针对特定代码问题或修复的短期分支;例如反馈甚至新功能。功能分支上的工作在获得批准后将合并到稳定分支中。我的功能分支是“dev”和“uat”。
不稳定或修补分支是为开发和测试错误修复而创建的短期私有快速修复分支。它们被合并到功能分支中并被删除。“hotfix”在我的项目中是一个不稳定的分支。
相关文章:

如何使用简单的分支策略来保护您的 Git 项目
良好的分支策略可以使项目源代码获得一致且安全的数据,所有协作者可以在更短的生命周期内共享和访问这些数据。 您必须以灵活的方式设计项目模型,以便对所有成员角色和权限进行良好的管理。 我要谈论的并没有什么令人惊讶的新鲜事。您可能已经知道一些…...

vue3的 nextTick()的使用
引言: 当你修改了响应式状态时,DOM 会被自动更新。但是需要注意的是,DOM 更新不是同步的。Vue 会在“next tick”更新周期中缓冲所有状态的修改,以确保不管你进行了多少次状态修改,每个组件都只会被更新一次。 要等待…...

Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现
Redis Lua沙盒绕过 命令执行(CVE-2022-0543)漏洞复现 Redis如果在没有开启认证的情况下,可以导致任意用户在可以访问目标服务器的情况下未授权访问Redis以及读取Redis的数据。–那么这也就是redis未授权访问了 Redis的默认端口是6379 可以用空间测绘搜索ÿ…...

react中useState、useRef、变量之间的区别
函数组件有函数作用域,每次render时,声明的方法会生成新的引用,声明的普通变量会重新声明并赋值初始值,而useRef和useState会保留状态。 useState、useRef、变量的区别 1. useState 组件更新不会改变之前的状态,可以保…...

企业软件的分类|app小程序网站定制开发
企业软件的分类|app小程序网站定制开发 企业软件是指为满足企业管理和运营需求而设计和开发的一类软件,它通常用于支持企业的各项业务活动和流程。根据其功能和应用领域的不同,可以将企业软件分为以下几类。 1. 企业资源计划(ERP)…...

Flink(八)【窗口】
前言 终于忙完了四门专业课的期末,确实挺累啊。今天开始继续学习 Flink ,接着上次的内容。 今日摘录: 他觉得一个人奋斗更轻松自在。跟没有干劲的人在一起厮混,只会徒增压力。 -《解忧杂货店》 1、窗口 之前我们已经了解了…...

云轴科技ZStack信创云平台助力国泰君安期货实现信创改造
信创是数字中国建设的重要组成部分,也是数字经济发展的关键推动力量。作为云基础软件企业,云轴科技ZStack 产品矩阵全面覆盖数据中心云基础设施,ZStack信创云首批通过可信云《一云多芯IaaS平台能力要求》先进级,是其中唯一兼容四种…...

C语言猜数字小游戏
本文将介绍如何使用C语言写一个猜数字的小游戏 具体代码如下: #include<stdio.h> #include<stdlib.h> #include<time.h>// 显示游戏菜单 void menu() {printf("**** 猜数字游戏! ****\n");printf("**** 按1开始游戏 ****\…...

自定义BeanPostProcessor之XssBeanPostProcessor
什么是BeanPostProcessor BeanPostProcessor是Spring框架中的一个重要的扩展点,它允许开发者在Bean初始化前后对Bean进行自定义处理。Spring中有很多内置的BeanPostProcessor,如AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcess…...

如何使用Windows自带的IIS服务搭建本地站点并远程访问
文章目录 1.前言2.Windows网页设置2.1 Windows IIS功能设置2.2 IIS网页访问测试 3. Cpolar内网穿透3.1 下载安装Cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar本地设置 4.公网访问测试5.结语 1.前言 在网上各种教程和介绍中,搭建网页都会借助各种软件的帮助…...

【微软技术栈】基于任务的异步编程
本文内容 隐式创建和运行任务显式创建和运行任务任务 ID任务创建选项任务、线程和区域性创建任务延续创建分离的子任务创建子任务等待任务完成组合任务处理任务中的异常取消任务TaskFactory 类无委托的任务自定义计划程序相关数据结构自定义任务类型 任务并行库 (TPL) 以“任…...

react hooks 学习之react router v6 路由表配置
/ 如果你是在ts中,那么这个这个文件名是router.ts那么这个<Home/>这里会报eslint错误,所以为了解决这个错误,直接改成router.tsx就行 import { RouteObject } from react-router-dom; import Home from ../page/Home; import About fr…...

Echarts 设置数据条颜色 宽度
设置数据条颜色(推荐) let yData [{value: 500,time: 2012-11-12,itemStyle: //设置数据条颜色{normal: { color: red }}},{value: 454,time: 2020-5-17},{value: 544,time: 2022-1-22},{value: 877,time: 2013-1-30}, {value: 877,time: 2012-11-12}]…...

2023-11-30 通过中缀表达式转换后缀表达式, 用C语言完成一个简单的计算器
点击 <C 语言编程核心突破> 快速C语言入门 通过中缀表达式转换后缀表达式, 用C语言完成一个简单的计算器 前言一、中缀表达式和后缀表达式 (AI辅助)二、中缀转后缀规则及后缀运算规则 (AI辅助)总结 前言 要解决问题: 在练习用Qt完成一个简单的计算器时, 需要将一个文本…...

设计模式总目录
目录 设计模式 1. 创建型模式 1.1 工厂方法模式 1.2 抽象工厂模式 1.3 单例模式 1.4 建造者模式 1.5原型模式 2. 结构型模式 2.1 适配器模式 2.2 装饰器模式 2.3 代理模式 2.4 外观模式 2.5 桥接模式 2.6 组合模式 2.7 享元模式 3. 行为型模式 3.1 策略模式 …...

通俗理解词向量模型,预训练模型,Transfomer,Bert和GPT的发展脉络和如何实践
最近研究GPT,深入的从transfomer的原理和代码看来一下,现在把学习的资料和自己的理解整理一下。 这个文章写的很通俗易懂,把transformer的来龙去脉,还举例了很多不错的例子。 Transformer通俗笔记:从Word2Vec、Seq2S…...

键入网址到网页显示,期间发生了什么?(计算机网络)
浏览器首先会对URL进行解析 下面以http://www.server.com/dir1/file1.html为例 当没有路径名时,就代表访问根目录下事先设置的默认文件,也就是 /index.html 或者 /default.html 对URL进行解析之后,浏览器确定了 Web 服务器和文件名&#x…...

python-GC机制、装饰器、生成器、迭代器、三元表达式、列表生成式、生成器表达式、函数递归、面向对象、
1 基础知识 1.1 GC机制 Python的垃圾回收,其实高级的语言都有自己的垃圾回收机制简称GC, python当中主要通过三种方式解决垃圾回收的方式,引用计数、标记清除、分代回收。引用计数:如果有新的引用指向对象,对象引用计…...

Linux命令--根据端口号查看进程号(PID)
Linux命令–根据端口号查看进程号(PID) 查找8080端口对应的进程号: netstat -nlp|grep :8297对应的进程号1061,如果想杀掉此进程,可以用一下命令: kill -9 1061...

LangChain 9 模型Model I/O 聊天提示词ChatPromptTemplate, 少量样本提示词FewShotPrompt
LangChain系列文章 LangChain 实现给动物取名字,LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储,读取YouTube的视频文本搜索I…...

使用 Vue3 + Pinia + Ant Design Vue3 搭建后台管理系统
Vue3 & Ant Design Vue3基础 nodejs版本要求:node-v18.16.0-x64 nodejs基础配置 npm -v node -vnpm config set prefix "D:\software\nodejs\node_global" npm config set cache "D:\software\nodejs\node_cache"npm config get registry …...

SpringCloud核心组件
Eureka 注册中心,服务的注册与发现 Feign远程调用 Ribbon负载均衡,默认轮询 Hystrix 熔断 降级 Zuul微服务网关(这个组件负责网络路由,可以做统一的降级、限流、认证授权、安全) Eureka 微服务的功能主要有以下几…...

基于C++11实现将IP地址、端口号和连接状态写入文件
要基于C11实现将IP地址、端口号和连接状态写入文件,您可以使用std::ofstream类来打开文件并进行写入操作。以下是一个示例: #include <iostream> #include <fstream>void writeConnectionStatus(const std::string& ip, int port, bool…...

非空断言,
先看下TypeScript基础之非空断言操作符、可选链运算符、空值合并运算符-CSDN博客 我没有复现出来,但是我知道了它的作用 用 let str: string arg!; 代替 let str: string; if (arg) { str arg; } 非空断言(!)和不使用的区别在于对于…...

Spark---创建DataFrame的方式
1、读取json格式的文件创建DataFrame 注意: 1、可以两种方式读取json格式的文件。 2、df.show()默认显示前20行数据。 3、DataFrame原生API可以操作DataFrame。 4、注册成临时表时,表中的列默认按ascii顺序显示列。 df.createTempView("mytab…...

瑜伽学习零基础入门,各种瑜伽教学方法全集
一、教程描述 练习瑜伽的好处多多,能够保证平衡健康的身体基础,提升气质、塑造形体、陶冶情操,等等。本套教程是瑜伽的组合教程,共由33套视频教程组合而成,包含了塑身纤体,速效瘦身,四季养生&a…...

pycharm编译报错处理
1.c生成工具下载 https://visualstudio.microsoft.com/visual-cpp-build-tools/ 在这里插入图片描述 pip install pycocotools...

“华为杯”研究生数学建模竞赛2019年-【华为杯】E题:基于多变量的全球气候与极端天气模型的构建与应用(附python代码实现)
目录 摘 要: 一.问题重述 1.1 问题背景 1.2 问题提出 二.模型假设及符号设定...

冒泡排序(适合编程新手的体质)
冒泡排序:简单而高效的排序技巧 欢迎来到我们今天的博客,我们将一起探索计算机科学中最基本但同时也非常重要的概念之一:冒泡排序。无论你是编程新手还是有一些编程经验的读者,这篇博客都将帮助你更好地理解冒泡排序的原理和应用…...

pdfjs,pdf懒加载
PDF.js是一个使用JavaScript实现的PDF阅读器,它可以在Web浏览器中显示PDF文档。PDF.js支持懒加载,也就是说,它可以在用户滚动页面时才加载PDF文档的某些部分,从而减少初始加载时间和内存占用。 注意点:如果要运行在多留…...