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

news2024/11/24 11:33:19

前言

  • 最近工作中发现,很多开发人员连最基本的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.coloradmin.cn/o/1465620.html

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

相关文章

Python实战:读取MATLAB文件数据(.mat文件)

Python实战&#xff1a;读取MATLAB文件数据(.mat文件) &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 &#x1f448; 希望得到您的订阅…

七分钟交友匿名聊天室源码

应用介绍 本文来自&#xff1a;七分钟交友匿名聊天室源码 - 源码1688 简介&#xff1a; 多人在线聊天交友工具&#xff0c;无需注册即可畅所欲言&#xff01;你也可以放心讲述自己的故事&#xff0c;说出自己的秘密&#xff0c;因为谁也不知道对方是谁。 运行说明&#xff…

docker镜像和容器的关系

背景 镜像和容器都是docker中非常重要的概念&#xff0c;镜像是静态的&#xff0c;而容器是动态的&#xff0c;两者的关系就类似类和实例的关系&#xff0c;本文就来分析下两者的关联 镜像和容器 我们知道镜像是存放在仓库中的静态的文件&#xff0c;而容器是运行中的进程&a…

厌倦了混乱的代码?掌握编写干净代码库的艺术

对于入门的开发人员来说&#xff0c;虽然克服了最初的障碍&#xff0c;学会了编程&#xff0c;找到了理想的工作。但其编程旅程并没有就此结束。他们面临真正的挑战&#xff1a;如何编写更好的代码。这不仅仅是为了完善功能&#xff0c;还要编写出经得起时间考验的优雅、可维护…

HTML5 Canvas 限定文本区域大小,文字自动换行,自动缩放

<!DOCTYPE html> <html> <body><h1>HTML5 Canvas 限定文本展示范围、自动计算缩放字体大小</h1><div id"tips">0</div> <div id"content">良田千顷不过一日三餐广厦万间只睡卧榻三尺良田千顷不过一日三餐…

发电机组启动前的准备和检查注意事项

发电机组启动前的准备&#xff1a; 1.检查润滑油的油位、 冷却液液位、燃油量&#xff1b; 2.检查机的供油、润滑、冷却等系统各个管路及接头有无漏油漏水现象&#xff1b; 3.检查电气线路有无破皮等漏电隐患&#xff0c;接地线电气线路是否松动&#xff0c;机组与基础的连接是…

MES系统中的手动排产和自动排产-助力生产效率

企业在排产管理中面临的问题&#xff1a; 大多数的企业在调度排产过程中&#xff0c;都会遇到以下问题。首先是插单非常的多&#xff0c;计划调整困难&#xff0c;会经常性的发生原材料、零部件的备货不足。计划按MRP或库存展示计算出需求后将产生大量工单&#xff0c;这些工单…

transformer 最简单学习1 输入层embeddings layer,词向量的生成和位置编码

词向量的生成可以通过嵌入层&#xff08;Embedding Layer&#xff09;来完成。嵌入层是神经网络中的一种常用层&#xff0c;用于将离散的词索引转换为密集的词向量。以下是一个典型的步骤&#xff1a; 建立词表&#xff1a;首先&#xff0c;需要从训练数据中收集所有的词汇&…

vue 常用库

vue-cropper 一个优雅的图片裁剪插件 dayjs Day.js 是一个轻量的处理时间和日期的 JavaScript 库&#xff0c;和 Moment.js 的 API 设计保持完全一样 NutUI-Bingo 基于 NutUI 的抽奖组件库&#xff0c;助力营销活动和小游戏场景。

java面试题之mybatis篇

什么是ORM&#xff1f; ORM&#xff08;Object/Relational Mapping&#xff09;即对象关系映射&#xff0c;是一种数据持久化技术。它在对象模型和关系型数据库直接建立起对应关系&#xff0c;并且提供一种机制&#xff0c;通过JavaBean对象去操作数据库表的数据。 MyBatis通过…

内容检索(2024.02.23)

随着创作数量的增加&#xff0c;博客文章所涉及的内容越来越庞杂&#xff0c;为了更为方便地阅读&#xff0c;后续更新发布的文章将陆续在此汇总并附上原文链接&#xff0c;感兴趣的小伙伴们可持续关注文章发布动态&#xff01; 本期更新内容&#xff1a; 1. 电磁兼容理论与实…

C语言——指针——第2篇——(第20篇)

坚持就是胜利 文章目录 一、指针和数组二、二级指针1、什么是 二级指针&#xff1f;2、二级指针 解引用 三、指针数组模拟二维数组 一、指针和数组 问&#xff08;1&#xff09;&#xff1a;指针和数组之间是什么关系呢&#xff1f; 答&#xff1a;指针变量就是指针变量&…

【spring】 ApplicationListener的使用及原理简析

文章目录 使用示例&#xff1a;原理简析&#xff1a; 前言&#xff1a;ApplicationListener 是spring提供的一个监听器&#xff0c;它可以实现一个简单的发布-订阅功能&#xff0c;用有点外行但最简单通俗的话来解释&#xff1a;监听到主业务在执行到了某个节点之后&#xff0c…

GitHub热门项目之Memos 打造私有备忘录

效果 1. 写备忘录或简单笔记&#xff0c;支持Markdown 2. 时间线 3. 探索可以看到其他用户公开的内容 项目地址 usememos/memos&#xff1a;一种开源的轻量级笔记服务。轻松捕捉和分享您的伟大想法。 (github.com)https://github.com/usememos/memos 体验地址 Memoshttp://…

精通Django模板(模板语法、继承、融合与Jinja2语法的应用指南)

模板&#xff1a; 基础知识&#xff1a; ​ 在Django框架中&#xff0c;模板是可以帮助开发者快速⽣成呈现给⽤户⻚⾯的⼯具模板的设计⽅式实现了我们MVT中VT的解耦(M: Model, V:View, T:Template)&#xff0c;VT有着N:M的关系&#xff0c;⼀个V可以调⽤任意T&#xff0c;⼀个…

【操作系统】磁盘文件管理系统

实验六 磁盘文件管理的模拟实现 实验目的 文件系统是操作系统中用来存储和管理信息的机构&#xff0c;具有按名存取的功能&#xff0c;不仅能方便用户对信息的使用&#xff0c;也有效提高了信息的安全性。本实验模拟文件系统的目录结构&#xff0c;并在此基础上实现文件的各种…

【服务器数据恢复】FreeNAS+ESXi虚拟机数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器通过FreeNAS&#xff08;本案例使用的是UFS2文件系统&#xff09;实现iSCSI存储&#xff0c;整个UFS2文件系统作为一个文件挂载到ESXi虚拟化系统&#xff08;安装在另外2台服务器上&#xff09;上。该虚拟化系统一共有5台虚拟机&…

Elasticsearch从入门到精通-01认识Elasticsearch

Elasticsearch从入门到精通-01认识Elasticsearch &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f342;博主从本篇正式开始ES学习&#xff0c;希望小伙伴可以一起探讨 &#x1f4d6; 本篇主要介绍和大家一块简单认识下ES并了解ES中的主要角色…

H5获取手机相机或相册图片两种方式-Android通过webview传递多张照片给H5

需求目的&#xff1a; 手机机通过webView展示H5网页&#xff0c;在特殊场景下&#xff0c;需要使用相机拍照或者从相册获取照片&#xff0c;上传后台。 完整流程效果&#xff1a; 如下图 一、H5界面样例代码 使用html文件格式&#xff0c;文件直接打开就可以展示布局&#…

爬虫知识--03

数据存mysql import requests from bs4 import BeautifulSoup import pymysql# 链接数据库pymysql conn pymysql.connect(userroot,password"JIAJIA",host127.0.0.1,databasecnblogs,port3306, ) cursor conn.cursor() cursor conn.cursor()# 爬数据 res request…