GIT分支管理策略

news2024/11/14 13:57:46

git基本操作

git操作的前提条件:

  • 本地windows安装git

  • 学习idea中的插件使用

idea的git基本操作:

  • 远程仓库remote

  • 更新fetch:git fetch

  • 拉取pull: git pull

  • 上传push: git push

  • 合并merge: git merge 合并分支

  • 本地提交commit:git commit

  • 分支branch: git branch 查看分支或者 切换分支

上述命令属于非常常见的git操作命令,基本使用git必用到的,但是相对来讲,使用idea插件会弱化他们原生命令的使用.

好处是简单,坏处是对底层命令不熟悉,会导致在插件中的各种选项问题困扰.本文基于idea的git插件,不需要过多了解,如有兴趣和需要请自行查询相关官方文档即可.

git分支

为了方便资源版本更新中对多人协作的并行开发进行有效的管理,git存在分支的概念.

我们可以利用分支记录一个稳定或者测试通过的版本,在新分支开发新功能,而在出现问题后及时切换回去.

同时一个功能过于复杂的时候,也可以建立并行的多个分支,多人同时开发最终合并等.

在git分支管理中存在远程分支和本地分支两种类型.

远程分支

托管中心平台或者服务器中可以查看的分支.一般是本地提交上传的同步.

本地分支

开发者操作的本地git仓库内容,一般会与远程分支在数量和名称上保持同步.

gitflow分支管理策略

企业中,分支决不能想创建就创建,想删除就删除,必须要遵循一定的规范和约定,那么分支管理策略就诞生了.

gitflow 最完善,最严格,最复杂的分支管理策略.

分支定义

Git Flow 是最早出现也是最经典的一种分支管理策略,它由两个长期分支和三种类型的临时分支组成。

1、永久分支:

Master 分支 (product stable)

主分支。用于存放经过测试,完全稳定的代码。永远都是可发布分支。

Develop 分支

开发分支一开始从master分离而来,用于存放基本稳定的代码。当该分支代码稳定,可发布版本时,合并到master分支上。

2、临时分支

Feature 分支

功能模块分支,从dev分支分离而来,用于开发项目功能,当开发新功能时以

feature -xxx命名,开发完成后,合并到develop上,合并后删除自己。

Release 分支

版本预发布分支,当v2.0版本发布时,可以从develop分支签出release-2.0,进行测试,测试出现问题,在release-2.0.1进行修改,测试完毕后准备发布将代码合并至master分支和develop分支上,给master打上v2.0.1的标签,合并后删除自己,这样做可以不影响下个版本功能的开发。

Hotfix 分支

线上紧急bug修复的分支,命名为hotfix-xxx,修改完成后,合并到master分支和develop分支,合并到master后打上修复版本的tag,合并后删除自己。

gitflow分支管理策略评价

Git flow的优点是清晰可控,缺点是相对复杂,需要同时维护两个长期分支。大多数工具都将master当作默认分支,可是开发是在develop分支进行的,这导致经常要切换分支,非常烦人。

更大问题在于,这个模式是基于"版本发布"的,目标是一段时间以后产出一个新版本。但是,很多网站项目是"持续发布",代码一有变动,就部署一次。这时,master分支和develop分支的差别不大,没必要维护两个长期分支。

所以一般网站项目不采用gitflow分支管理策略,而严格版本发布的项目比如游戏,可能采纳gitflow更多.

GITHUB FLOW分支管理策略

想必于gitflow的繁重和复杂,github flow可谓是轻盈小巧.其核心目的就是应对长期持续发布的项目.

分支使用流程

和gitflow不太一样,github减轻了流程的重量,只有一个长期分支master,并且没有复杂的短期分支release hotfix.

创建分支(Create a branch)

在你开发任何新功能完成之前,都在当前版本创建一个新分支,这时不需要管其他开发者在做什么.但是你的新分支最好具有具体的功能描述命名,让其他开发者一看就知道他在干什么.

新增提交(add and commit)

只要你创建了分支,就说明你要对它进行修改啦!无论添加、修改、还是删除文件,你都必须进行提交,将它们同步到你的分支上。当你在分支上工作的时候,这些提交操作可以跟踪你的工作进度。

提交操作也建立一个关于你工作的透明历史,通过查看这些提交记录,其他人可以知道你做了什么和为什么这么做。每个提交操作都有一个相关的提交信息(Commit messages),用于描述你做出的修改。此外, 每一个提交操作都被视为一个“修改单元”。如果发现了 bug 或者决定走不同的开发方向,你也可以通过这些“修改单元”进行回滚操作。

提示(ProTip)

提交信息非常的重要,特别是当你将修改的内容提交到服务器之后,Git 可以追踪到你的修改内容并展示它们。通过写清楚的提交信息,你可以让其他人更容易跟上我们的思路并提供反馈。

提出 Pull 请求(Open a pull request)

当你的开发实现了阶段性内容的时候,可以提交pull request.等待审核人员审核.

讨论和评估你的代码(Discuss and review your code)

当你提出 Pull 请求的时候,审查你的更改内容的人或团队可能有一些问题或者意见。也许你的编码风格与项目规范不符,或者缺少单元测试,也有可能所有的东西看起来都很棒,条理清晰。Pull 请求的目的就是鼓励和捕捉这种类型的对话。

你也可以在大家讨论和给出关于你提交内容的反馈时,继续 Push 你的分支。如果有人评论说你什么没有做,或者代码中有 bug,你也可以及时把它修复,然后 Push 这些修改。GitHub 将会给你展示出最新评论和反馈,你也可以在 Pull 请求的视图中统一接收这些消息。

部署(Deploy)

只要你的 Pull 请求被审查并且通过了你的测试,你就可以部署这些修改,在生产环境中验证她们。如果分支发生了问题,你也可以回滚到之前的状态。

合并(Merge)

现在, 你修改的内容已经在生产环境中验证了,是时候将你的代码合并到master分支啦!合并之后,Pull 请求就保存了一份关于你修改代码的历史记录。因为它们是可搜索的,所有任何人都可以通过搜索了解你为什么这么修改以及如何修改的。

github flow分支关了策略评价

Github flow 的最大优点就是简单,对于"持续发布"的产品,可以说是最合适的流程。

问题在于它的假设:master分支的更新与产品的发布是一致的。也就是说,master分支的最新代码,默认就是当前的线上代码。

可是,有些时候并非如此,代码合并进入master分支,并不代表它就能立刻发布。比如,苹果商店的APP提交审核以后,等一段时间才能上架。这时,如果还有新的代码提交,master分支就会与刚发布的版本不一致。另一个例子是,有些公司有发布窗口,只有指定时间才能发布,这也会导致线上版本落后于master分支。

上面这种情况,只有master一个主分支就不够用了。通常,你不得不在master分支以外,另外新建一production分支跟踪线上版本。

GITLAB FLOW分支管理策略

分支定义

工作流提供了一种简单、透明和有效的 git 工作方式,并与问题跟踪系统相结合。

可以说是gitflow和github的综合体现.

GitLab 推荐用生产分支来解决上述问题:

Gitlab flow 的最大原则叫做"上游优先"(upsteam first),即只存在一个主分支(开发环境)develop,它是所有其他分支的"上游"。只有上游分支采纳的代码变化,才能应用到其他分支。

分支使用方案

  • 持续发布

对于"持续发布"的项目,它建议在develop分支以外,再建立不同的环境分支。比如,"开发环境"的分支是develop,"预发环境"的分支是pre-production,"生产环境"的分支是production。

开发分支是预发分支的"上游",预发分支又是生产分支的"上游"。代码的变化,必须由"上游"向"下游"发展。比如,生产环境出现了bug,这时就要新建一个功能分支,先把它合并到develop,确认没有问题,再cherry-pick到pre-production,这一步也没有问题,才进入production。

只有紧急情况,才允许跳过上游,直接合并到下游分支。

  • 版本发布

对于"版本发布"的项目,建议的做法是每一个稳定版本,都要从master分支拉出一个分支,比如2-3-stable、2-4-stable等等。

以后,只有修补bug,才允许将代码合并到这些分支,并且此时要更新小版本号。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/359853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot整合Junit

创建项目 idea创建空项目Empty Project。项目中创建模块,选择SpringBoot Initialize快速构建SpringBoot项目。 依赖这里什么也不用选择。 pom文件中默认有两个依赖: spring-boot-starter springboot如果不导入任何依赖,默认的一个基础依赖。spring-…

5.3 线程安全问题解决方案

文章目录1.概述2.同步和异步3.synchronized同步关键字3.1 写法3.2 前提3.3 特点4.练习-改造售票案例-继承Thread4.1 代码实现4.2 注意事项5.练习-改造售票案例-实现Runnable接口5.1 代码实现5.2 注意事项6.练习-改造售票案例-使用线程池6.1 代码实现6.2 代码分析7.线程锁7.1 悲…

七、确保web安全的HTTPS

HTTPS 1、HTTP 的缺点 HTTP的主要缺点: 通信使用明文(不加密),内容可能会被窃听 HTTP 本身不具备加密的功能,因此无法做到对通信整体(使用 HTTP 协议通信的请求和响应的内容)进行加密。所以按…

actipro-winforms-controls-23.1.0 Crack

actipro-winforms一组用于构建漂亮的 Windows 窗体桌面应用程序的 UI 控件,用于构建 IDE 的高级停靠窗口、MDI、属性网格、树控件和文件夹/文件浏览器,用于常见数据类型、自动完成、屏蔽编辑和代码编辑的强大编辑器,功能区、图表、微型图表、…

Centos7 安装 MySQL 8.0.31详细教程(亲测无障碍必成功)

操作之前,首先检查防火墙是否关闭(直接设置永久关闭) 查看防火墙状态:firewall-cmd --state 禁止firewall开机启动 永久生效:systemctl disable firewalld.service 重启电脑:reboot 1. 在FinallShell上传或…

Julia 教程

Julia 是一个开源的编程语言,采用 MIT 许可证,每个人都可以免费使用。 Julia 是一个面向科学计算的高性能动态高级程序设计语言。 Julia 最初是为了满足高性能数值分析和计算科学的需要而设计的,不需要解释器,速度快。 Julia 于…

筛选效率直接起飞,复杂场景秒变简单丨三叠云

表单 路径 表单设计 >> 高级筛选 功能简介 筛选条件优化升级,支持多种混合条件筛选。 功能描述: 本次更新支持2个层级的条件,系统处理数据时,将会先根据第二个层级的条件关系找出数据、继而再根据第一层级即分组之间的…

解决CondaUpgradeError网上的方法都不奏效(回退版本、upgrade/update都不行)的问题和CondaValueError

问题描述 Executing transaction: failed ERROR conda.core.link:_execute(502): An error occurred while installing package ‘conda-forge::certifi-2022.9.24-pyhd8ed1ab_0’. CondaUpgradeError: This environment has previously been operated on by a conda version…

Java 基础——File 类与 I/O 流

目录1.java.io.File 类的使用1.1.概述1.2.构造器1.3.常用方法1.3.1.获取文件和目录基本信息1.3.2.列出目录的下一级1.3.3.File类的重命名功能1.3.4.判断功能的方法1.3.5.创建、删除功能2.I/O 流原理及流的分类2.1.I/O 原理2.2.流的分类2.3.流的 API3.节点流之一:Fil…

项目经理PMO分别是什么?

1. PMO是什么?(1)定义PMO项目经理(Project Management Office Manager),也称为项目管理办公室经理、项目管理中心或者项目管理部。一般来说,PMO就是负责公司项目管理政策、标准的制定&#xff0…

C/C++每日一练(20230220)

目录 1. 利用字母组成图形 2. 子集 II 3. 路径总和 II 附录 深度优先搜索算法 广度优先搜索算法 1. 利用字母组成图形 利用字母可以组成一些美丽的图形,下面给出了一个例子: ABCDEFG BABCDEF CBABCDE DCBABCD EDCBABC 这是一个5行7列的图形&…

ROS2入门-话题-服务-接口

ROS2入门-话题-服务-接口 本文学习的是《动手学ROS2》 报错放在另一个文章中。 文章目录ROS2入门-话题-服务-接口Linux常用命令sudochomd 修改文件权限安装软件apt安装软件dpkg安装deb包打开终端VS code关机/重启静态链接库/动态链接库Cmake设置treeROS节点功能包创建功能包列…

数据分析,如何看待我国1400万人忍受极端通勤,单程通勤超60分钟!

女生极限通勤每天来回 6.5 小时,上海某位女士公司离家单程约100公里左右,单程通勤需要3小15分,来回通勤时间为6.5小时。如此长的通勤时间却不是个例,全国有超1400万人正在忍受单程超过60分钟的极端通勤,如何看待我国 1…

将默认安装的 WSL2 迁移至指定目录

将默认安装的 WSL2 迁移至指定目录WSL2 默认安装在 C 盘下,系统盘空间有限,推荐更改安装目录。 1. 默认安装的 WSL2 目录 C:\Users\cheng\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\ext4.vhdx 2. …

使用Swiper插件实现视频轮播,怎么实现切换自动播放视频?

一、需求分析 这两天讨论了一个项目需求,刚开始是希望:轮播图中嵌入视频,轮播到视频自动播放,播放完毕切换下一张轮播,手动切换时暂停播放视频。后面因为自动播放没有声音,便暂时放弃了这个想法&#xff0…

第2讲-数据库系统的结构抽象与演变(测试题总结)

一、测试题 DBS的三级模式:外模式(也叫用户模式或子模式),模式(也叫逻辑模式),内模式(也叫存储模式) 外模式/模式映像 实现了数据的逻辑独立性 模式/内模式映像 实现了…

李宏毅流模型

李宏毅流模型 常见的3中生成模型,Flow-base Model是第四种生成模型 2. normal distribution:正态分布 max object function:最大目标函数 dimention:维度 Inverse function:反函数 如果两个函数本身就互为反函数,那么这两个函数求解得到的两…

一、在没有Vuex如何解决组件间数据传递的问题

Vuex【state、mutations、actions、modules、getters】 一、在没有Vuex如何解决组件间数据传递的问题 举例:点击不同的选项卡来切换页面时 选项卡和页面属于不同的组件,他们都在同一个父组件之下。 选项卡和页面组件的数据都来源于父组件。在选项卡组…

Relational KD(CVPR 2019)原理与代码解析

paper:Relational Knowledge Distillationcode:https://github.com/megvii-research/mdistiller/blob/master/mdistiller/distillers/RKD.py背景本文从语言结构主义的角度来重新审视知识蒸馏,前者主要关注一个符号学系统中的结构关系。索续尔…

Linux系列 linux 常用命令(笔记)

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​​ 目录 前言 一.linux 常用命令(目录文和件基本操作) 1.命令的分类…