GitLab flow工作流及其使用

news2025/2/3 14:02:34

问题背景

Git flow和Github flow及其问题

使用GitLab flow

目录

什么是GitLab工作流

功能分支

生产分支

使用GitLab flow环境分支

使用GitLab flow发布分支

使用GitLab flow合并/拉取请求

使用GitLab flow进行问题跟踪

链接和关闭合并请求中的问题

用rebase压缩提交

减少功能分支中的合并提交

经常投入并频繁推动

如何写一个好的提交信息

合并前进行测试

使用功能分支

Git flow和Github flow及其问题

因为Git flow过于复杂,所以GitHub创建了一个更简单的替代方案GitHub flow。

GitHub flow是一个更简单的选择。

使用GitLab flow

GitHub flow仅具有功能分支和master分支。将所有内容合并到master分支中,并进行频繁部署意味着您可以将未发布的代码量减到最少,这与精化和持续交付的最佳实践是一致的。但是,这种流程仍然留下了许多有关部署,环境,发行版以及与issues集成的问题,这些问题尚未得到解答。使用GitLab flow,我们为这些问题提供额外的指导。

什么是GitLab工作流

## 什么是GitLab工作流

* 简化的分支策略

* 所有功能和修改首先转到master分支

* 允许”production”或”stable”分支

* Bug修复/热修复补丁是从master中挑选出来的

功能分支

## 功能分支

* 创建功能或错误修正分支以完成所有工作

* 使用合并请求合并到master分支

生产分支

## 生产分支

* 一个长期运行的生产发布分支,而不是单个稳定分支

* 考虑为每个要部署的版本创建一个标签

GitHub flow假设您每次合并功能分支都将其部署到生产环境。这对于SaaS应用程序是可能的,但是在许多情况下这是不可能的。一种情况是您无法控制发布的时间,例如,通过应用商店验证时发布的iOS应用程序。另一种情况是,当您有部署窗口时间(例如,上午10点到下午4点的工作日,工作团队处于满负荷状态时),但是您有时还会合并代码。在这些情况下,您可以创建一个反映已部署代码的生产分支。您可以通过合并master到生产分支,来部署新版本。如果您需要了解生产分支中使用的代码,则只需切换到生产分支即可查看。当在版本控制系统中,合并提交的大约时间很容易看出。如果您自动部署生产分支,那么这段时间非常准确。如果需要更精确的时间,可以让部署脚本在每个部署上创建一个标签。该flow流程可防止Git flow中出现的发布,标记和合并的开销。

GitLab flow环境分支

一个好主意是拥有一个自动更新到master分支的环境。仅在这种情况下,此环境的名称可能与分支名称不同。假设您有一个暂存环境,一个预生产环境和一个生产环境。在这种情况下,请将master分支部署到暂存。要部署到预生产,分支,请创建从master分支到预生产分支的合并请求。通过将预生产分支合并到生产分支来上线。此工作流仅在下游进行提交,可确保在所有环境中对所有内容进行测试。如果您需要通过修补程序挑选提交,通常是在功能分支上进行开发并在合并请求中将其合并到master。在这种情况下,请不要删除功能分支。如果master通过自动测试,然后将功能分支合并到其他分支。如果由于需要更多的手动测试而无法进行此操作,则可以将合并请求从功能分支发送到下游分支。

GitLab flow发布分支

## GitLab flow发布分支

* 如果您向客户发布软件,则很有用

* 准备新版本时,请从master创建稳定分支

* 考虑为每个版本创建标签

* 挑选关键bug修复到稳定分支,以发布补丁

* 永远不要将bug修复直接提交给稳定分支

仅当需要将软件发布到外界时,才需要使用发布分支。在这种情况下,每个分支都包含次要版本,例如2-3-stable,2-4-stable等。以master为起点创建稳定的分支,并尽可能晚地分支。这样,您可以将bug修复程序应用于多个分支的时间减至最少。宣布发布分支后,仅将严重的bug修复程序添加到分支。如果可能的话,请先将这些bug修复程序合并到master中,然后再将其修补到发布分支中。如果从合并到发行分支开始,您可能会忘记将它们修补到master中,然后在后续发行版中会遇到相同的bug。合并到master然后选择发布的方式称为“上游优先”策略,Google和Red Hat也采用这种策略。每次在发布分支中加入bug修复程序时,请通过设置新标签来增加补丁程序版本(以符合Semantic Versioning的要求)。一些项目还具有一个稳定的分支,该分支指向与最新发布分支相同的提交。在此流程中,通常不具有生产分支(或Git flow master分支)。

使用GitLab flow合并/拉取请求

合并或拉取请求在Git管理应用程序中创建。他们要求指定的人合并两个分支。GitHub和Bitbucket等工具选择名称“ pull request”,因为第一个手动操作是拉出功能分支。GitLab等工具选择名称“合并请求”,因为最后的动作是合并功能分支。在本文中,我们将它们称为合并请求。

如果您在功能分支上工作了几个小时以上,最好与团队的其他成员分享中间结果。为此,请创建一个合并请求,而不将其分配给任何人。而是在描述或评论中提及人们,例如“ / cc @mark @susan”表示合并请求尚未准备好进行合并,但是欢迎您提供反馈。您的团队成员可以对合并请求进行整体注释,也可以在特定的行上添加注释。合并请求用作代码审查工具,不需要单独的代码审查工具。如果审查发现缺点,那么任何人都可以提交并推动修复程序。通常,执行此操作的人是合并请求的创建者。当新的提交被推送到分支时,合并请求中的差异会自动更新。

准备好要合并功能分支时,请将合并请求分配给最了解您要更改的代码库的人员。另外,请提及您要反馈的其他任何人。在指定的人对结果感到满意之后,他们可以合并分支。如果指定的人不舒服,他们可以请求更多更改或关闭合并请求而不合并。

在GitLab中,通常会保护长期存在的分支,例如master分支,以使大多数开发人员无法修改它们。因此,如果要合并到受保护的分支,请将合并请求分配给具有维护者权限的人员。

合并功能分支后,应将其从源代码控制软件中删除。在GitLab中,可以在合并时执行此操作。删除完成的分支可确保分支列表仅显示正在进行的工作。它还可以确保如果有人重新打开问题,他们可以使用相同的分支名称而不会引起问题。

> 注意: 重新打开问题时,您需要创建一个新的合并请求。

使用GitLab flow进行问题跟踪

GitLab流是一种使代码与问题跟踪器之间的关系更加透明的方法。

对代码的任何重大更改都应从描述目标的问题开始。对于每次代码更改都有理由有助于通知团队其他成员,并使功能分支的范围保持较小。在GitLab中,对代码库的每次更改都以问题跟踪系统中的问题开始。如果还没有问题,请创建问题,只要更改需要大量的工作,即超过1小时。在许多组织中,提出问题是开发过程的一部分,因为它们用于sprint计划。问题标题应描述系统的期望状态。例如,问题标题“作为管理员,我要删除用户而不会收到错误”比“管理员无法删除用户”更好。

准备编写代码时,请从分支为该问题创建一个master分支。此分支是进行此更改相关工作的地方。

> 注意: 分支机构的名称可能由组织标准决定。例如,在GitLab中,GitLab EE中与GitLab CE中的分支等效的任何分支都必须以结尾-ee。

完成或要讨论代码后,请打开合并请求。合并请求是讨论更改并查看代码的在线位置。

如果您打开合并请求但未将其分配给任何人,则这是一个“进行中”合并请求。这些用于讨论建议的实现,但尚未准备好包含在master分支中。使用[WIP]或WIP:阻止合并请求的标题在准备好之前进行合并。

当您认为代码已准备就绪时,请将合并请求分配给审阅者。当他们认为代码已准备好包含在master分支中时,审阅者可以合并更改。当他们按下合并按钮时,GitLab将合并代码并创建一个合并提交,此事件稍后将很容易看到。合并请求始终会创建一个合并提交,即使分支可以不带一个就被合并。这种合并策略在Git中被称为“无快进”。合并后,删除功能分支,因为不再需要它。在GitLab中,合并时可以选择删除。

假设分支已合并,但是出现了问题,并且重新打开了该问题。在这种情况下,重用相同的分支名称没有问题,因为合并时第一个分支已删除。在任何时候,每个问题最多都有一个分支。一个功能分支有可能解决多个问题。

链接和关闭合并请求中的问题

## 链接和关闭合并请求中的问题

通过在提交消息或合并请求的描述中提及问题来链接到问题,例如,“ Fixes#16”或“ Duck type is优选”。请参见#12。” GitLab然后创建指向所提到问题的链接,并在问题中创建评论,并链接回合并请求。

要自动关闭链接的问题,请用“ fixes”或“ closes”一词来提及它们,例如,“ fixes#14”或“ closes#67”。当代码合并到默认分支时,GitLab会关闭这些问题。

如果您的问题跨越多个存储库,请为每个存储库创建一个问题,并将所有问题链接到父问题。

用rebase压缩提交

## 用rebase压缩提交

使用Git,您可以使用交互式rebase(rebase -i)将多个提交压缩为一个或重新排序。如果要用单个提交替换几个小的提交,或者想使订单更合逻辑,则此功能很有用。

但是,您永远都不应为已推送到远程服务器的提交提供基准。变基会为所有更改创建新的提交,这可能会引起混乱,因为同一更改将具有多个标识符。对于在同一分支上工作的任何人,这还会导致合并错误,因为他们的历史记录与您的历史记录不匹配。另外,如果有人已经检查过您的代码,则重新基准化将很难分辨自上次检查以来发生了什么变化。

您也应该永远不要使其他人创作的提交成为基准。这不仅会重写历史记录,还会丢失作者信息。重新定价可以防止其他作者被归属和共享部分内容git blame。

如果合并涉及许多提交,则撤消似乎更加困难。您可能会想通过在合并之前将所有更改压缩到一个提交中来解决此问题,但是如前所述,将已经推送的提交重新设置基础是一个坏主意。幸运的是,有一种简单的方法可以撤消其所有提交的合并。完成此操作的方法是还原合并提交。保留这种还原合并的能力是在--no-ff手动合并时始终使用“无快速转发”()策略的一个很好的理由。

> 注意: 如果先还原合并提交,然后改变主意,请还原还原提交以重做合并。Git不允许您再次合并代码。

减少功能分支中的合并提交

## 减少功能分支中的合并提交

进行大量合并提交会使您的存储库历史记录混乱。因此,您应该尝试避免在功能分支中合并提交。通常,人们通过在master分支上的提交之后仅使用rebase对提交进行重新排序来避免合并提交。使用rebase可以防止在合并master到功能分支时进行合并提交,并且可以创建整齐的线性历史记录。但是,如有关重新基准化一节中所述,您永远都不应对已推送到远程服务器的提交进行重新基准化。此限制使您无法重新评估已经与团队共享的进行中的工作,这是我们建议的做法。

重新定基还会产生更多工作,因为每次重新定基时,都必须解决类似的冲突。有时您可以重用记录的分辨率(rerere),但是合并起来更好,因为您只需解决一次冲突。Atlassian 在其博客上对合并和重新定标之间的权衡取舍做了更详尽的解释。

防止创建许多合并提交的一个好方法是不经常合并master到功能分支中。合并的原因有三个master:利用新代码,解决合并冲突以及更新长期运行的分支。

如果您需要利用master创建功能分支后引入的一些代码,通常可以通过选择提交来解决此问题。

如果功能分支存在合并冲突,则创建合并提交是解决此问题的一种标准方法。

> 注意: 有时您可以使用.gitattributes来减少合并冲突。例如,您可以将更改日志文件设置为使用联合合并驱动程序,以使多个新条目不会相互冲突。

创建合并提交的最后一个原因是使长时间运行的功能分支与项目的最新状态保持最新。这里的解决方案是使您的功能分支短暂存在。大多数功能分支的工作时间应少于一天。如果要素分支通常需要一天以上的工作,请尝试将要素拆分为较小的工作单元。

如果您需要将功能分支保持打开状态超过一天,则有一些策略可以使它保持最新状态。一种选择是master在一天开始时使用连续集成(CI)进行合并。另一个选择是仅从明确定义的时间点合并,例如,标记的发布。您还可以使用功能切换按钮隐藏不完整的功能,以便仍可以合并到master每一天。

> 注意:不要将自动分支测试与持续集成混为一谈。马丁·福勒(Martin Fowler)在有关要素分支的文章中做了以下区分:

>“我听说人们说他们正在做CI,因为他们每次提交时都在每个分支上运行构建(也许使用CI服务器)。那是持续不断的建设,是一件好事,但是没有集成,所以它不是CI。”

总之,您应该尝试防止合并提交,但不要消除它们。您的代码库应该是干净的,但是您的历史记录应该代表实际发生的情况。开发软件的过程非常麻烦,而且步履蹒跚,可以让您的历史反映这一点。您可以使用工具查看提交的网络图,并了解创建代码的混乱历史记录。如果您重新设置代码基础,则历史记录是不正确的,并且由于工具无法处理更改的提交标识符,因此无法补救。

经常投入并频繁推动

## 经常投入并频繁推动

使开发工作更轻松的另一种方法是经常提交。每次您拥有一组有效的测试和代码时,都应该提交。将工作分为单个提交,为开发人员稍后查看您的代码提供了上下文。较小的提交可以清楚地说明功能的开发方式,并且可以轻松地回滚到特定的时间点或还原一个代码更改而无需还原几个无关的更改。

经常投入也可以轻松地共享您的工作,这一点很重要,这样每个人都可以知道您的工作。即使功能分支尚未准备好进行审查,也应经常推送它。通过在功能分支或合并请求中共享您的工作,可以防止团队成员重复工作。在完成之前共享您的工作还可以进行有关更改的讨论和反馈,这可以帮助您在审查之前改进代码。

如何写一个好的提交信息

## 如何写一个好的提交信息

提交消息应该反映您的意图,而不仅仅是提交的内容。很容易看到提交中的更改,因此提交消息应说明您为什么进行这些更改。良好的提交消息的一个示例是:“组合模板以减少用户视图中的重复代码。”单词“更改”,“改进”,“修复”和“重构”不会在提交消息中添加太多信息。例如,将“改善XML生成”更好地写为“在XML生成中正确地转义特殊字符。

合并前进行测试

## 合并前进行测试

在旧的工作流程中,持续集成(CI)服务器通常master仅在分支上运行测试。开发人员必须确保其代码不会中断master分支。使用GitLab流时,开发人员从该master分支创建其分支,因此至关重要的是永不中断。因此,必须在接受每个合并请求之前对其进行测试。诸如Travis CI和GitLab CI之类的CI软件会在合并请求本身中显示构建结果,以简化此过程。

测试合并请求有一个缺点:CI服务器仅测试功能分支本身,而不测试合并结果。理想情况下,服务器还可以master在每次更改后测试分支。但是,对每个提交的重新测试在master计算上都是昂贵的,这意味着您更加频繁地等待测试结果。由于功能分支应该短暂存在,因此仅测试分支是可以接受的风险。如果新的提交master原因合并与功能分支冲突,请合并master回分支以使CI服务器重新运行测试。如前所述,如果您的功能分支经常持续几天以上,则应该缩小问题范围。

使用功能分支

## 使用功能分支

创建功能分支时,请始终从最新分支开始master。如果您在开始之前就知道您的工作依赖于另一个分支,则也可以从那里分支。如果您需要在启动后合并到另一个分支中,请在合并提交中说明原因。如果尚未将提交推送到共享位置,则还可以通过基于master或其他功能分支合并更改。如果您的代码可以正常工作并且不进行合并,则不要从上游再次合并。仅在需要时进行合并才能阻止在功能分支中创建合并提交,这些合并提交最终会破坏master历史记录。

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

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

相关文章

ElasticSearch备考 -- Multi field

一、题目 Create the index hamlet_2 with one primary shard and no replicas Copy the mapping of hamlet_1 into hamlet_2, but also define a multi-field for speaker. The name of such multi-field is tokens and its data type is the (default) analysed string Reind…

【工程测试技术】第6章 信号处理初步,频谱分析,相关系数

目录 6.1 数字信号处理的基本步骤 6.2 离散信号及其频谱分析 6.2.1 概述 6.2.2 时域采样、混叠和采样定理 6.2.3 量化和量化误差 6.2.4 截断、泄漏和窗函数 6.2.5 频域采样、时域周期延拓和栅栏效应 6.2.6 频率分辨率、整周期截断 6.3 相关分析及其应用 6.3.1 两…

Emissive CEO Fabien Barati谈《消失的法老》背后的故事:XR大空间体验的创新与未来

在最近的一次播客访谈中,虚拟现实之声(Voices of VR)的主持人Kent Bye与Emissive公司的联合创始人兼CEO Fabien Barati进行了深入交流。Emissive是全球顶级的VR大空间体验制作商之一,以其沉浸式探险项目如《永恒的巴黎圣母院》和《胡夫地平线》而闻名。以下是这次访谈的核心…

VSCode debug模式无法跳转进入内置模块

在使用VSCode调试python代码的时候, 需要查看第三方库的代码,进行调试。 但是VSCode默认是不进入的, 因此需要更改Debug配置: 在launch.json 里加入如下的代码: "justMyCode": false 这样就能进入第三方库…

计算有向无环图中两节点间简单路径的数量

计算有向无环图中两节点间简单路径的数量 主要步骤:伪代码:C代码实现:解释:在给定一个有向无环图(DAG)以及两个节点s和t时,我们需要计算从节点s到节点t之间的简单路径的数量。为了实现这一目标,我们可以使用动态规划的思想,在拓扑排序的基础上解决问题。 主要步骤: 拓…

【Linux第五课-进程概念下】环境变量、程序地址空间

目录 环境变量main参数 --- 命令行参数环境变量环境变量特性 --- 命令行操作main函数的参数获取环境变量environ获取环境变量getenv()获取环境变量unset移除本地变量或环境变量set显示本地变量 代码获取和设置环境变量 本地变量 程序地址空间什么是进程地址空间为什么有地址空间…

预算有限也能玩转 AI:香橙派、树莓派与 Jetson 的选择攻略

随着 AI 技术的迅猛发展,越来越多的边缘计算设备可以处理从轻量级任务到复杂的 AI 模型。在本文中,我们将对比几款主流的边缘 AI 设备,包括 NVIDIA Jetson 系列、香橙派 和 树莓派 5,并探讨 Hailo 加速器 在边缘 AI 领域的潜力。我…

【学习笔记】手写一个简单的 Spring MVC

目录 一、什么是Spring MVC ? Spring 和 Spring MVC 的区别? Spring MVC 的运行流程? 二、实现步骤 1. DispatcherServlet 1. 创建一个中央分发器 拦截所有请求 测试 2. 接管 IOC 容器 1. 创建配置文件 2. 修改 web.xml 配置文件 …

vSAN03:vSAN故障处理、节点维护、删除节点、关闭/重启/删除vSAN集群

目录 vSAN故障处理单节点维护从vSAN集群中永久删除节点关闭vSAN集群重启vSAN集群删除vSAN集群 vSAN故障处理 级别状态处理可能原因活动正常无无缺失vSAN 检测到临时组件故障,且其中的组件可以恢复并还原其工作状态,则该组件将处于“缺失”状态。&#x…

分析JS Crash(进程崩溃)

一、JS Crash异常检测能力 1、JS Crash日志规格 以下是进程崩溃日志信息中对应字段解释。 Build info:XXX-XXXX X.X.X.XX(XXXXXXXX) <- 版本信息 Module name:com.example.myapplication <- 模块名 Version:1.0.0 <- 版本号 Pid:579 <- 进程号 Uid:0 <- 用户ID…

【Qt】Qt学习笔记(一):Qt界面初识

Qt 是一个跨平台应用程序和 UI 开发框架。使用 Qt 您只需一次性开发应用程序&#xff0c;无须重新编写源代码&#xff0c;便可跨不同桌面和嵌入式操作系统部署这些应用程序。Qt Creator是跨平台的Qt集成开发环境。 创建项目 Qt的一些界面&#xff0c;初学时一般选择Qt Widgets …

VirtualBox虚拟机连接宿主机并能够上网(小白向)

现存问题 windows系统主要使用vmare和virtualbox两种虚拟机&#xff0c;virtualbox相对于vmare更加轻便&#xff0c;但少有博客能够详细说明使用virtualbox的教程。踩了网上的坑后&#xff0c;决定写一篇文章介绍virtualbox虚拟机上网的流程。 需求 1. virtualbox虚拟机与宿主机…

Linux 文件 IO 管理(第四讲:软硬链接和动静态库)

Linux 文件 IO 管理&#xff08;第四讲&#xff1a;软硬链接和动静态库&#xff09; 软硬链接操作与现象软链接硬链接 解释软链接硬链接作用 动静态库初识静态库怎么做库&#xff08;开发角度&#xff09;怎么用库&#xff08;使用角度&#xff09;安装当前目录直接使用 动态库…

JavaWeb程序设计(第四版)习题参考答案

JavaWeb程序设计&#xff08;第四版&#xff09;习题参考答案 目录 模块1 习题参考答案 模块2 习题参考答案 模块3 习题参考答案 模块4 习题参考答案 模块5 习题参考答案 模块6 习题参考答案 模块7 习题参考答案 模块8 习题参考答案 模块1 习题参考答案 选择题 1 .A …

WaveletGPT:基于小波的多尺度表征增强大型语言模型训练效率

斯坦福大学的研究人员首次将小波理论应用于大型语言模型&#xff0c;提出了WaveletGPT&#xff0c;通过在Transformer解码器层中添加多尺度滤波器&#xff0c;加速了模型训练速度&#xff0c;并在文本、音频和音乐等多个领域取得了显著的性能提升。 论文介绍 大型语言模型 (L…

求和问题题解

减 sort拍后就A了 #include <bits/stdc.h> #include <cstring> using namespace std; typedef long long ll; ll n,a[400005],cnt0,b[400005]; bool cmp(long long x,long long y){return x>y; } int main () {cin>>n;for(int i1;i<n;i){cin>>…

查缺补漏----同步,异步,半同步,分离式通信

目录 1.同步通信&#xff08;同步定时方式&#xff09; 2.异步通信 3.半同步通信 4.分离式通信 1.同步通信&#xff08;同步定时方式&#xff09; 同步通信方式&#xff08;比如SPI&#xff09;&#xff0c;是把许多字符组成一个信息组&#xff0c;这样&#xff0c;字符可…

Springboot 整合 durid

文章目录 Springboot 整合 druiddruid的优势配置参数使用整合 Druid配置数据源配置参数绑定配置参数配置监控页面配置拦截器 Springboot 整合 druid druid的优势 可以很好的监控 DB 池连接 和 SQL 的执行情况可以给数据库密码加密可以很方便的编写JDBC插件 配置参数 使用 整…

数据结构之树(4)

摘要&#xff1a;本篇主要讲哈夫曼树、并查集、二叉排序树、平衡二叉树等&#xff0c;非常非常非常重要&#xff01;&#xff01;&#xff01; 一、哈夫曼树 基于霍夫曼树&#xff0c;利用霍夫曼编码进行通信可以大大提高信道利用率&#xff0c;缩短信息传输时间&#xff0c;…

Android2024.2.1升级错误

提示 Gradle 版本不兼容&#xff0c;升级后就报错了 。 1.gradle安装包镜像 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists //distributionUrlhttps\://services.gradle.org/distributions/gradle-8.5-bin.zip distributionUrlhttps://mirrors.cloud.tencen…