【Git工具实战】实用真实 Git 开发工作流程

前言

  • 最近工作中发现,很多开发人员连最基本的Git怎么使用都不知道,比如什么时候切分支,什么时候合并代码,代码遇到冲突怎么办,经常出现掉代码,代码合并后丢失的情况。
  • 以下为个人总结的常规Git开发工作流程的使用,每个公司使用不一致,仅供参考
    在这里插入图片描述

分支分类

  • dev(开发)
  • test(测试)
  • uat (预发布)
  • master (生产)
    在这里插入图片描述

研发流程

  1. 需求评审
  2. 开发排期
  3. 编码开发
  4. 冒烟测试(单元测试)
  5. 冒烟通过,提交测试,合并代码到测试分支,部署测试环境
  6. 测试环境测试,开发修 BUG
  7. 测试完成,提交预发,合并代码到预发分支,部署预发环境
  8. 预发环境测试,开发修 bug
  9. 测试完成,产品验收
  10. 验收完成后,基于生产分支进行TAG
  11. 提交生产,合并代码到生产分支,部署生产环境
  12. 生产运营(客户)验收
  13. 验收完成,结项

实际操作

代码拉取

git clone https://code.xxx.com/xxx/xxx.git
  • 查看本地分支:git branch
  • 查看远程分支:git branch -a

创建版本分支

  • 本地创建版本分支:git branch fix-20240223-order
  • 本地切换版本分支:git checkout fix-20240223-order
  • 本地推送版本至远程仓库:git push origin fix-20240223-order:fix-20240223-order

分支名称是有规范和含义的,不能乱取
推荐格式:分支责任-需求日期/需求号-业务类型,一般按部门规范来,常见的有以下几种:

  • feat:新功能
  • fix:修补bug
  • doc:文档
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:测试
  • chore:构建过程或辅助工具的变动
  • 为啥拉取的是生产/预发分支

之所以要拉取 master 分支而不是拉取 dev/test,是因为后者可能包含着一些其他成员还未上线或者可能有 BUG的需求代码,这些代码没有通过验证,如果被你给拉取了,然后又基于此进行新的需求开发,那当你需求开发完成,而其他成员的需求还没上线,你将会把这些未验证的代码一起发送到 uat/master上,导致一系列问题。

在这里插入图片描述

需求完成,提交代码

  • 提交代码:
  • 首先先在本地把新的改动提交,提交描述的格式可以参考着分支名的格式

如果是新需求的提交,可以写成 “feat: 需求20240111-新增导出”
如果是 bug 修复,可以写成 “fix: 禅道3387-重复请求处理”

  • 提交本地代码至远程仓库
git add .
git commit -m "提交描述"
git push origin fix-20240223-order:fix-20240223-order
  • 提交之前可能需要更新,因为该分支是一个版本分支,可能开发人员有几个人同时在这个版本分支进行开发,这个时候可能同一种业务就可能存在代码冲突,需要解决。

版本需求完成,合并代码

  • 首先,我们需要认知到的是,每一个分支应该只对应一个版本,例如当我们开发01版本时,那么就创建一个 feat-01-order 分支进行开发;开发版本 02 时,就另外创建一个 feat-02-member 分支进行开发;修改生产环境的某个 bug 时,就创建 fix-bug-3378 进行开发,等等。

这样做的目的是,能够把不同的功能/需求/修改分离开来。想象一下这样一个场景,如果有某些紧急的需求是需要提前上线的,而此时你的分支里既包含了这些紧急的需求,又包含了其他未开发好的需求,那么这两种需求就不能拆开来分别进行提测和上线了。

  • 其次,在合并代码时,我们要将四种分支模型(dev、test、uat、master)作为参照物,而不是把关注点放在自己的分支上。比如我们要在 dev 上调试,那就需要把自己的分支合并到 dev 分支上;如果我们需要提测,则把自己的分支合并到 test 分支上,以此类推。

我们要关注到,这四个环境的分支上,会有什么内容,会新增什么内容。「切记不能反过来将除了 master 之外的三个分支合并到自己的代码上!!」 如果其他成员将自己的代码也提交到 dev 分支上,但是这个代码是没有通过验证的,此时你将 dev 往自己的分支上合,那之后的提测、上预发、生产则很大概率会出问题。「所以一定要保持自己的分支是干净的!」 而 master 分支对应的是生产环境,一般是最新的稳定版本,所以合并到自己的分支以获取最新的更改也是没什么问题的。

  • 前面我们已经把本地的版本分支推送至远程仓库后,在本地进行分支合并至 dev或者test
  • 把 本地版本分支 fix-20240223-order 更新至最新的代码,如合并至dev分支,更新dev分支至最新代码
  • 切换至 dev 分支:git checkout dev
  • 版本分支合并至dev分支(冲突解决):git merge fix-20240223-order
  • 环境分支推送至远程仓库:git push origin dev

常见问题

预发环境修完的 bug 要重新走测试再走预发,为什么呢?

预发布环境是介于测试和生产环境之间的一个环境,它的目的是模拟生产环境并进行更真实的测试。它是一个重要的测试环境,需要保持稳定和可靠。通过对修复的BUG再次提交到测试环境测试,可以确保预发布环境中的软件版本是经过验证的,并且没有明显的问题。

当然,也不是非要这么做不可,紧急情况下,也可以选择直接发到预生产重新测试

代码合并错误,并且已经推送到远程分支,如何解决?

  • 假设是在本地合并,本来要把特性分支合并到 uat 分支,结果不小心合到了 master分支
  • 切换到特性分支合并到的错误分支,比如是 master:git checkout master
  • 查看最近的合并信息(按 q 退出查看):git log --merges
  • 撤销合并:git revert -m 1 <merge commit ID>
    【这里的 merge commit ID 就是上一步查询出来的 ID 或者 ID 的前几个字符】
  • 撤销远程仓库的推送:git push -f origin master
    【这个命令会强制推送本地撤销合并后的 release 分支到远程仓库,覆盖掉远程仓库上的内容。(即,得通过一个新的提交来“撤销”上一次的提交,本质上是覆盖)】

cherry-pick 指令

  • 作用:选择某些提交的变更并将其应用到当前分支
  • 与 merge 的区别:如果你需要另一个分支的所有代码变动。那么就采用 merge;如果你只需要部分代码变动(某几个提交),那么就采用 cherry-pick

场景:有时候分支不一定是完全按照需求号来开发的,可能按照周期来进行开发,那当前版本内的分支上,可能就会包含着很多需求的提交,这时候,如果产品要求你只上某一个需求,但是其他的暂时还不能上,那就需要使用到 cherry pick 的操作,将该需求囊括的所有提交应用到对应环境分支上。「一定要注意梳理清楚被拆分需求是由多少 commit 组成的,不要有遗漏和多选。」
【更多参考:https://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html】

在这里插入图片描述

写在最后

  • 在团队内部使用规范的 Git 工作流程,可以帮助我们提高协作效率,减少混乱和冲突。比如规定好分支结构和命名规范,将使得代码库的分支结构更加清晰明了,更易于管理。反之,开发者可能会按照自己的喜好随意创建分支,导致代码库分支结构混乱。

  • 除此之外还有很多好处,降低错误风险、增加代码可追溯性、简化发布流程、促进持续集成与持续交付等等。

  • 参考资料:https://blog.csdn.net/u010800804/article/details/109594867

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

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

相关文章

Java架构师之路五、微服务:微服务架构、服务注册与发现、服务治理、服务监控、容器化等。

目录 微服务架构&#xff1a; 服务注册与发现&#xff1a; 服务治理&#xff1a; 服务监控&#xff1a; 容器化&#xff1a; 上篇&#xff1a;Java架构师之路四、分布式系统&#xff1a;分布式架构、分布式数据存储、分布式事务、分布式锁、分布式缓存、分布式消息中间件、…

C语言系列15——C语言的安全性与防御性编程

目录 写在开头1 缓冲区溢出&#xff1a;如何防范与处理1.1 缓冲区溢出的原因1.2 预防与处理策略 2. 安全的字符串处理函数与使用技巧2.1 strncpy函数2.2 snprintf函数2.3 strlcpy函数2.4 使用技巧 3 防御性编程的基本原则与实际方法3.1 基本原则3.2 实际方法 写在最后 写在开头…

思腾合力携京东打造服务器采购解决方案,助企业高校提升算力

随着云计算、大数据、人工智能的快速发展&#xff0c;服务器需求不断扩大&#xff0c;市场规模持续保持增长。IDC数据显示&#xff0c;预计2023年我国服务器市场规模将增至308亿美元。基于对服务器市场的趋势洞察&#xff0c;思腾合力携手京东品牌持续深化合作&#xff0c;在保…

深入浅出JVM(六)之前端编译过程与语法糖原理

本篇文章将围绕Java中的编译器&#xff0c;深入浅出的解析前端编译的流程、泛型、条件编译、增强for循环、可变长参数、lambda表达式等语法糖原理 编译器与执行引擎 编译器 Java中的编译器不止一种&#xff0c;Java编译器可以分为&#xff1a;前端编译器、即时编译器和提前编…

(提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战

文章目录 &#xff08;提供数据集下载&#xff09;基于大语言模型LangChain与ChatGLM3-6B本地知识库调优&#xff1a;数据集优化、参数调整、提示词Prompt优化本地知识库目标操作步骤问答测试的预设问题原始数据情况数据集优化&#xff1a;预处理&#xff0c;先后准备了三份数据…

mac下C、C++项目出现‘stdio.h’ file not found的解决方法

【转载】https://www.cnblogs.com/yongfengnice/p/14260997.html 有时候更新mac系统或者项目配置之后&#xff0c;打开之前的项目&#xff0c;发现出现莫名其妙的‘stdio.h’ file not found等头文件找不到。 解决这个问题之前&#xff0c;我们要弄清楚开发工具是引用了系统哪…

C++:STL简介

1. 什么是STL STL(standard template libaray- 标准模板库 ) &#xff1a; 是 C 标准库的重要组成部分 &#xff0c;不仅是一个可复用的组件库&#xff0c;而且 是一个包罗数据结构与算法的软件框架 。 2. STL的版本 3. STL的六大组件 4.STL的缺陷 1. STL库的更新太慢了。这…

用于将Grafana默认数据库sqlite3迁移到MySQL数据库

以下是一个方案&#xff0c;用于将Grafana数据迁移到MySQL数据库。 背景: grafana 默认采用的是sqlite3&#xff0c;当我们要以集群形式部署的时使用mysql较为方便&#xff0c;试了很多sqlite转mysql的方法要么收费,最后放弃。选择自己动手风衣足食。 目标: 迁移sqlite3切换…

速评谷歌开源大模型Gemma 7B

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

day16_ListSet课后练习题 - 参考答案

文章目录 day16_课后练习题第1题第2题第3题第4题第5题第6题第7题第8题 day16_课后练习题 第1题 案例&#xff1a; ​ 1、用一个String[]数组存点数 ​ 2、用一个String[]数组存花色 ​ 3、用一个String[]数组存大王、小王 ​ 4、用上面的数组&#xff0c;生成一副扑克牌 …

C++ 文件操作-文本文件-读取和打开文件方法详解

读文件步骤 #include <iostream> using namespace std; #include <fstream> #include <string> //文本文件 读文件void test(){// 1 包含头文件// 2 创建流对象ifstream ifs;// 3 打开文件 并且判断是否打开成功ifs.open("table.txt",ios::in); //…

VS 2015 发布 WebService

本文介绍了使用VS2015发布WebService的步骤 右键项目点击发布 选择文件系统和目标位置 配置选择Debug-Any CPU&#xff08;选其他也可以&#xff09; 4. 点击发布&#xff0c;在对应文件夹中可以看到发布出来的内容。 记录遇到的问题&#xff0c; 发布前要选择删除所有现有文…

【PostgreSQL】PostgreSQL详细介绍

PostgreSQL详细介绍 一、什么是PostgreSQL&#xff1f;二、为什么要使用PostgreSQL&#xff1f;三、PostgreSQL功能列表3.1 数据类型3.2 数据完整性3.3 并发&#xff0c;性能3.4 可靠性、灾难恢复3.5 安全3.6 可扩展性3.7 国际化&#xff0c;文本搜索 四、参考资料 关于Postgre…

使用MongoDB数据库和Mongoose库在Node.js中进行数据存储

在Node.js中使用MongoDB数据库和Mongoose库进行数据存储是前端开发中常用的技术之一。MongoDB是一种非关系型数据库&#xff0c;具有高性能、易扩展等优点&#xff1b;而Mongoose是在Node.js中对MongoDB进行操作的框架&#xff0c;简化了数据库操作&#xff0c;并提供了丰富的功…

音视频技术-双声道立体声与卡侬平衡线的“纠葛”

目录 一、新问题 二、问题排查 三、故障总结 四、原理分析 五、解决方案 1、救急 2、转接线1 3、转接线2

Js的 Promise的 then catch 笔记240222

Js的 Promise的 then catch 笔记240222 基本用法 new Promise(f>{setTimeout(ev>{f("一秒后输出控制台");},1000); }).then(f的参数>{console.log(f的参数); }); // 控制台输出: 一秒后输出控制台上面代码中, f 的标准名叫做 resolve , 所以应该写成 new …

知识图谱数据处理流程是什么

在当今信息时代&#xff0c;数据已经成为企业决策和业务发展的重要驱动力。然而&#xff0c;随着数据量的不断增加&#xff0c;传统的数据处理方法已经难以满足需求。知识图谱作为一种新兴的技术&#xff0c;正逐渐成为处理大规模数据的关键工具。本文将深入探讨知识图谱的数据…

写代码中的一些“小技巧”

目录 前言 1.不注重代码格式 1.1 空格 1.2 换行 2.随意的命名 2.1 有意义的参数名 2.2 见名知意 2.3 参数名风格一致 3.出现大量重复代码 4.从不写注释 5.方法过长 6.参数过多 7.代码层级太深 8.判断条件太多 9.硬编码 10.事务过大 11.在循环中远程调用 11.1 …

CSS 面试题汇总

CSS 面试题汇总 1. 介绍下 BFC 及其应 参考答案&#xff1a; 参考答案&#xff1a; 所谓 BFC&#xff0c;指的是一个独立的布局环境&#xff0c;BFC 内部的元素布局与外部互不影响。 触发 BFC 的方式有很多&#xff0c;常见的有&#xff1a; 设置浮动overflow 设置为 auto、scr…

Swift基础知识:20.Swift方法

在 Swift 中&#xff0c;方法是与特定类型相关联的函数。方法可以用于实例类型&#xff08;实例方法&#xff09;或类型本身&#xff08;类型方法&#xff09;。方法允许类型的实例执行特定的任务&#xff0c;也可以修改实例本身或实例的属性。 实例方法&#xff08;Instance …