Git团队协作及分支策略

news2024/11/29 1:55:40

目录

分布式版本控制系统

访问模型

分支策略-Git flow

feature

分支策略-Github flow

分支策略-Gitlab flow

主干开发模式

总结


分布式版本控制系统

分布式相比于集中式的最大区别在于开发者可以提交到本地,每个开发者通过克隆(git clone),在本地机器上拷贝一个完整的Git仓库。

 

访问模型

 

分支策略-Git flow

关于Git分支策略最早的见于Vincent在2010年发表的一篇博文《A successful Git branching model》

在这种模式下,主要维护了两类分支:

主要分支 (The main branch)
master
develop

辅助分支 (Supporting branch)
feature branch (功能分支)
release branch (预发布分支)
hotfix branch (热修复分支)

master
首先,代码库应该有一个、且仅有一个主分支。master 分支的代码永远是稳定的,可以随时发布到生产环境。

develop
develop 分支用于日常开发,保存了开发过程中最新的代码。

当 develop 分支上的代码达到稳定,并且具备发版状态时,需要将 develop 的代码合并到 master,并且打一个带有发布版本号的 tag。

 创建 develop 分支:

git checkout -b develop master

将 develop 合并到 master:

# 切换到 master 分支
git checkout master

# 对 develop 分支进行合并
git merge --no-ff develop

 

--no-ff 参数的作用是使当前的合并操作总是创建一个新的 commit 对象,即使该合并被执行为快进式(fast-forward)合并。

这样可以避免丢失掉该功能分支的历史信息,并且将针对该功能的所有提交都集中到一起。这样解释也并不是很易懂,通过下图来对比一下就比较明显了:

feature

  • 分支来源:develop
  • 合并到分支:develop
  • 分支命名约定:feature-*

功能分支,在开发某一个新功能时,从 develop 分支分出来,开发完之后,再合并回 develop 分支。

功能分支通常只存在于开发者的本地仓库中,并不包含在远程库中。

 创建一个功能分支:

git checkout -b feature-x develop

开发完成后,将功能分支合并到 develop 分支:

git checkout develop

git merge --no-ff feature-x

删除 feature 分支:

git branch -d feature-x

release
分支来源:develop
合并到分支:develop,master
分支命名约定:release-*
预发布分支,它是指发布正式版本之前,我们可能需要有一个预发布的版本测试,并且可以在上面做一些较小 bug 的修复。

预发布分支是从 develop 分支上分出来的,预发布结束以后,必须合并进 develop 和 master 分支。

创建一个预发布分支:

git checkout -b release-1.2 develop

确认没有问题后,合并到 master 分支:

git checkout master

git merge --no-ff release-1.2

# 对合并生成的新节点,做一个标签
git tag -a 1.2

最后,删除预发布分支:

git branch -d release-1.2

hotfix
分支来源:master
合并到分支:develop,master
分支命名约定:hotfix-*
最后一种是修复 bug 分支。软件正式发布以后,难免会出现 bug。这时就需要创建一个分支,进行 bug 修复。

修复 bug 分支是从 master 分支上分出来的。修复结束以后,再合并进 master 和 develop 分支。

创建一个修复 bug 分支

git checkout -b hotfix-0.1 master

 修复结束后,合并到 master 分支:

git checkout master

git merge --no-ff hotfix-0.1

git tag -a 0.1.1

再合并到 develop 分支:

git checkout develop

git merge --no-ff hotfix-0.1

最后,删除修复 bug 分支:

git branch -d hotfix-0.1

小结

优点:各分支权责分明,清晰可控,是很多分支管理策略的启蒙模型。

缺点:

  • 合并冲突:同时长期存在的分支可能会很多:master、develop、release、hotfix、若干并行的 feature 分支。两两之间都有可能发生冲突。频繁手动解决冲突不仅增加工作量,而且增大了出错的风险。
  • 功能分离:功能并行开发时,合并分支前无法测试组合功能,而且合并后可能会出现互相影响。
  • 无法持续交付:Git flow 更倾向于按计划发布,一个 feature 要经历很多步骤才能发布到正式环境,难以达到持续交付的要求。
  • 无法持续集成:持续集成鼓励更加频繁的代码集成和交互,尽早解决冲突,而 Git flow 的分支策略隔离了代码,尽可能推迟代码集成。

分支策略-Github flow

Github flow 是一个轻量级的基于分支的工作流程。它由 GitHub 在 2011 年创建。分支是 Git 中的核心概念,并且 GitHub 工作流程中的一切都以此为基础。

它只有一个长期分支 master,其他分支都在其基础上创建。使用流程如下:

  1. 根据需求,从 master 拉出新分支,不用区分功能分支或修复分支,但需要给出描述性的名称。
  2. 本地的修改直接提交到该分支,并定期将其推送到远程库上的同一命名分支。
  3. 新分支开发完成后,或者需要讨论的时候,向 master 发起一个 Pull Request(简称 PR)。
  4. Pull Request 既是一个通知,让别人注意到你的请求,又是一种对话机制,大家一起评审和讨论你的代码。对话过程中,你还可以不断提交代码。
  5. 你的 Pull Request 被接受,合并进 master,重新部署后,原来你拉出来的那个分支就被删除了。


小结:
优点:

  • 降低了分支管理复杂度,更适合小型团队,或者维护单个版本的项目开发。
  • 工作流程简单,对持续交付和持续集成友好。

缺点:无法支持多版本代码部署。

分支策略- flow

它是 Git flow 与 Github flow 的综合。吸取了两者的优点,既有适应不同开发环境的弹性,又有单一主分支的简单和便利。

Gitlab flow 和 Github flow 之间的最大区别是 Gitlab flow 支持环境分支。

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

Gitlab flow 分成两种情形来应付不同的开发流程:

  1. 持续发布
  2. 版本发布


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

开发分支 master 用于发布到测试环境,该分支为受保护的分支。
预发分支 pre-production 用于发布到预发环境,上游分支为 master。
正式分支 production 用于发布到正式环境,上游分支为 pre-production。
如果生产环境(production)发生错误,则要建一个新分支修改完后合并到最上游的开发分支(master)此时就是(Upstream first),且经过测试,再继续往 pre-production 合并,要经过测试没有问题了才能够再往下合并到生产环境。

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

在出现 bug 后,根据对应的 release branch 创建一个修复分支,修复工作完成后,一样要按照上游优选的原则,先合并到 master 分支,经过测试才能够合并到 release 分支,并且此时要更新小版本号。

小结
优点:

可以区分不同的环境部署。
对持续交付和持续集成友好。
缺点:

分支多,流程管理复杂。
 

主干开发模式

主干开发,是指开发人员直接向主干(习惯上主干分支通常为:trunk 或 master)提交/推送代码。通常,开发团队的成员1天至少1次地将代码提交到主干分支。在到达发布条件时,从主干拉出发布分支(通常为 release),用于发布。若发现缺陷,直接在主干上修复,并根据需要 cherry pick 到对应版本的发布分支。

 

优点:

  • 分支模型简单高效,开发人员易于掌握不容易出现错误操作

  • 避免了分支合并、冲突解决的困扰

  • 随时拥有可发布的版本

  • 有利于持续集成和持续交付

缺点:

  • 基础架构要求高:合入到主干的代码若质量不过关将直接阻塞整个团队的开发工作,因此需要高效的持续集成平台进行把关;

  • 自动化测试要求高:需有完备单元测试代码,确保在代码合入主干前能在获得快速和可靠的质量反馈;

  • 最好有代码评审:若代码质量要求高,需要配套代码评审(CR)机制,在代码提交到主干时,触发CR,通过 Peer Review 后才能正式合入;

  • 最好有特性开关:主干开发频发合入主干的情况下,特性拆分得很小,可能是半成品特性,需要配套特性开关(Feature Toggle),只有当特性整体开发完才通过灰度发布等手段逐步打开;

适用环境:

  • 对迭代速度要求高,希望需求快速交付上线

  • 基础架构强,持续集成工具高效;

  • 团队成员习惯TDD(测试驱动开发),代码自动化测试覆盖率高(至少增量代码的自动化测试覆盖率高);

总结:

没有最好的的版本控制策略,只有适合自己的版本控政策略,不同的应用场景,以及开发的人员习惯都会影响我们的决策,我们需要考虑分支冲突、版本安全可控、管理复杂度等各方面。

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

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

相关文章

Pytest参数化-下篇

😎😎原文出自:测个der,博主的公众号,格式美观一些。 关于参数化的其他案例 数据嵌套及多参数传参 import pytestpwd_datas [["QINGAN",{"user":"SHIER","pwd":"1234…

5个关键词回顾2022年个推技术实践

作为一家数据智能服务商,2022年每日互动(个推)在为开发者和行业客户提供优质服务的同时,不断砥砺创新,追逐技术前沿。个推还持续参与开发者生态建设,积极总结、分享自身技术实战经验,面向行业输…

该如何测客户端专项测试?

整个行业现在越来越重视客户端的专项测试了。像接口的性能测试、webview 测试、H5性能分析等,每一项都需要测试。而对于卡顿的分析、系统资源分析、耗电量测试及弱网测试这块,也变得越来越重要了!后面也会有相关的文章更新。大家可以戳此关注…

快解析远程访问解决方案——安全稳定,部署简单

我们说的远程办公通常指狭义上的远程办公,是指通过远程技术,或远程控制软件,对远程电脑进行操作办公,实现非本地办公,如在家办公、异地办公、移动办公等远程办公模式。这种技术的关键在于:穿透内网和远程控制的安全性。…

Wisej.NET 3.1.6 Crack

新功能 Wisej.NET 3.1 通过添加几个新的独特功能和简化的安装过程增强了里程碑 3.0 版本。 除了大量错误修复和对我们库的显着性能增强之外,3.1 还包括以下值得注意的新功能: 视觉工作室市场 Wisej.NET 现在比以往任何时候都更容易使用。或 Visual Studi…

联合证券|五大国际巨鳄集体爆雷,美股期指大跳水!

商场现已进入到雷雨季! 周五晚间,花旗、摩根大通、高盛、富国和贝莱德团体爆雷。 花旗集团上一年第四季度每股收益低于预期,尽管营收好于预期。花旗集团Q4每股收益1.16美元,预期为1.17美元。财报发布之后一度暴降超3%;…

【机器学习之模型融合】Stacking堆叠法

目录 1、Stacking的基本思想💍 2、思考💎 3、在sklearn中实现Stacking🎯 3.1、导入工具库和数据👕 3.2、定义交叉验证评估函数👗 3.3、个体学习器与元学习器的定义🍗 3.4、模型构建🍪 4…

【Linux】创建新用户 sudo配置,添加信任

目录 一、创建新用户 二、sudo不被允许 三、添加信任用户 一、创建新用户 相关指令: adduser [用户名]:创建新用户 passwd [用户名]:修改用户密码 su [用户名]:切换到该用户 设置密码,重复输入两遍之后&#xff0…

大数据技术架构(组件)——Hive:环境准备1

1.0.1、环境准备1.0.1.0、maven安装1.0.1.0.1、下载软件包1.0.1.0.2、配置环境变量1.0.1.0.3、调整maven仓库打开$MAVEN_HOME/conf/settings.xml文件&#xff0c;调整maven仓库地址以及镜像地址<settings xmIns"http://maven.apache.org/SETTINGS/1.0.0"xmIns:xsi…

电脑磁盘占用率高怎么办?

Windows磁盘占用率高是一种普遍存在的问题&#xff0c;相信很多用户遇到过不止一次&#xff0c;它可能是在刚开机时、可能是在下载文件时、也可能是在开启关闭应用程序时……当磁盘占用高之后&#xff0c;您的计算机运行速度会变得像蜗牛一样缓慢&#xff0c;更糟糕的是有些电脑…

python 代码注释

文章目录写在前面使用方法plainEpytextGoogleNumpyreStructuredText相关程序包其他写在前面 如果说高效率的算法是一个项目的内核&#xff0c;那么完备的文档注释、API 接口则是项目的外壳&#xff0c;直接与客户交互。 pycharm 提供了 5 种 代码注释格式。 分别是 plain, epy…

Tslib配置文件ts.conf

默认&#xff1a; # Access plugins ################# Uncomment if you wish to use the linux input layer event interface module_raw input# For other driver modules, see the ts.conf man page# Filter plugins ################# Uncomment if first or last sample…

【运维心得】正确的校正mysql-slave及mysqldump

实践出真知&#xff0c;有些细节&#xff0c;记录下。本文不涉及主备知识&#xff0c;有需右转: https://blog.csdn.net/qq_26834611/article/details/121385550mysql 正确的dump 命令:0. 检查当前主库所在位置ip addr 查看虚拟ip所在位置 1. 备机数据库dump备份:mysqldump -ur…

【ChatGPT】注册OpenAI账号试用ChatGPT

主要参考&#xff1a; 手把手教你注册 AI 聊天机器人模型 ChatGPT&#xff1a;大体流程注册OpenAI账号试用ChatGPT指南&#xff1a; 相关网站 openai: https://beta.openai.com/signup直接登录charGPT&#xff1a;https://chat.openai.com/接入微信&#xff0c;1.2K&#xf…

OneKeyGhost工具进行备份还原windows操作系统

OneKeyGhost OneKey Ghost是一款设计专业、操作简便的绿色程序&#xff0c;能够在 Windows 下对任意分区进行一键备份、恢复&#xff0c;支持ISO文件、光盘、U盘里的GHO文件硬盘安装。 OneKeyGhost备份wind系统 系统需要包含两个磁盘&#xff0c;一个系统盘另外一个数据盘。 …

Linux-文件权限命令

用户及权限操作 d:表示文件夹&#xff0c;-&#xff1a;表示文件&#xff0c;后面每隔3个分别代表 u、g、o。 使用ls -l &#xff08;ll&#xff09;可查看文件&#xff08;目录&#xff09;的权限 使用 chmod 可修改文件权限&#xff0c;有两种使用格式&#xff1a;字母法…

剑指offer五道题,C++实现,看看自己能不能解出来。

第一道&#xff08;剑指offer46 把数字翻译成字符串&#xff09; 给定一个数字&#xff0c;我们按照如下规则把它翻译为字符串&#xff1a;0 翻译成 “a” &#xff0c;1 翻译成 “b”&#xff0c;……&#xff0c;11 翻译成 “l”&#xff0c;……&#xff0c;25 翻译成 “z”…

在产业互联网诞生之初,其仅被当成是互联网的衍生品和避风港

在流量和资本的红利已然被出清的大背景下&#xff0c;以平台经济为代表的互联网经济的发展同样被逼退到了进退维谷的境地里。如何突破以往发展模式的束缚&#xff0c;如何让互联网行业的发展重新开启新的想象空间&#xff0c;成为每一个互联网玩家必然需要思考的重要课题。于是…

python 列表生成式

列表生成式 列表生成式的结构是在一个中括号里包含一个表达式,然后是一个for语句,然后是0个或多个for或者if语句。列表表达式可以是任意的,意思是你可以在列表中放入任意类型的对象。返回结果将是一个新的列表 # 去除偶数 hh[[1,2,3],[4,5,6],[7,8,9] ]#从做往右读就行 print…

Rpc了解

1、为什么要有rpc? 因为微服务之间需要进行服务间的通信&#xff0c;不同服务之间的接口要互相调用。而常见的通信协议主要有 RPC 和 REST 协议 使用rpc的好处是&#xff1a; 引入RPC框架对我们现有的代码影响最小&#xff0c;同时又可以帮我们实现架构上的扩展 两者对比 …