Git工作流和Commit规范

Git大家都非常熟悉了,就不做过多介绍,但是如何用好Git、如何进行合理的分支开发、Merge你是否有一个规范流程呢?💤

不论是一个团队一起开发一个项目,还是自己独立开发一个项目,都少不了要和Git打交道,这些都是作为开发者必须要掌握的。每个团队也许有自己的Git工作流,今天小许给你分享一个通用的流程和规范。

既然说到Git得先有个协同原则:

统一使用Git作为版本控制的主要工具。

统一使用GitFlow流程管理控制版本

基本命令操作

git add . :将变更从工作目录移至暂存区域

git commit -m “fix: xxx” :将暂存区中的文件提交到本地仓库中分支中

git pull:用于从远程获取代码并合并本地的版本

git push:用于从将本地的分支版本上传到远程并合并

这些操作命令在各个工作区、仓库之间如何进行流转的呢?如下图
在这里插入图片描述
git有好几个区,工作区(workspace)、暂存区(indexStage)、本地仓库(local repository)、还有远程仓库(remote repository)。

远程仓库为我们保存一份代码,如github,而工作区、暂存区和本地仓库都在本地

常用分支建议
前面简单讲了下代码提交流程,但是版本控制并不是简单代码提交就完事了,这里分享一些常用的分支开发,但并不是任何项目都一定按照这种分支结构来定义,按你的需求来确定需要哪些。比如你一个人开发一个小型项目,那么就不用搞的那么复杂,如果是多人协同开发版本迭代较快,那么下面的分支内容会让你开发节奏更清晰合理!
在这里插入图片描述

生产分支(master)‌
master分支是仓库的主分支,也有人叫production分支,这个分支包含最近发布到生产环境的代码,最近发布的release, 这个分支只能从其他分支合并,不能在这个分支直接修改‌master 分支一般由release、develop以及hotfix分支合并,任何时间都不能直接修改代码开发分支(develop)‌
这个分支是我们的主开发分支,始终保持最新完成以及bug修复后的代码.包含所有要发布到下一个release的代码,这个主要合并与其他分支,比如feature分支‌一般开发的新功能时,feature分支都是基于develop分支下创建的补丁分支(hotfix)‌
当我们在生产环境发现新的Bug时候,我们需要基于master分支创建一个hotfix分支,然后在hotfix分支上修复bug完成hotfix后,我们要把hotfix分支合并回master和develop分支‌,所以hotfix的改动会进入下一个release发布分支(release)‌
当你需要发布一个新功能的时候,要基于develop分支创建一个release分支在release分支做为基准进行测试并修复bug,完成release后,把release合并到master和develop分支‌release 分支为预上线分支,发布提测阶段,会release分支代码为基准提测功能分支(feature)‌
feature分支主要是用来开发一个新的功能,一旦开发完成,我们合并回develop分支,然后提交合并请求到 release 分支进行提测。分支命名: feature/ 开头的为特性分支, 命名规则: feature/user_module、 feature/cart_module

Git工作流
上面那么多种分支类型,而且不同的分支又是基于其他分支,每次看完之后都记得,但是结合起来发现仅仅停留在有印象,是的,我们不好从单纯的文字上理清分支之间的关系和合并方式。

没关系,小许用个图把之间的关系梳理清楚:
在这里插入图片描述
其实核心是要弄明白主干和各个开发分支的关系,以及你的开发分支该和谁去合并。

不过还是那句话根据自己的项目和业务团队去指定Git工作,不能为了更风去创建并不适合团队的分支,不然会导致开发在无聊的敲命令,花费时间在各种分支的合并上,反而降低了效率。

适合别人的未必适合大家,互相交流,选择合适自己的!

更多方位的流程,大家可以看看这篇文章# 字节研发设施下的 Git 工作流

Commit编写规范
好的Commit messages 日志编写会带来极大的帮助,它也反映了一个开发人员是否是良好的协作者,更重要的是在后续修复bug和实现新的feture时,对于之前实现的功能、解决的bug可以一目了然,而不用通过阅读代码去了解曾经的实现,因为这会是意见非常痛苦的事情!

忘了说,你的Commit messages会是Code Review人员参考基本,你应该不想被无情的打回吧?😅😅😅

目前,社区有多种 Commit messages 的写法规范。来自Angular (前端框架)规范是目前使用最广的写法,比较合理和系统化。

其实浏览过Github开源项目的同学,如果有注意Pull requests的话就有了解,行我我们看下Angular的提交规范到底是咋样的,为啥会成为参考标杆🚩🚩🚩。
在这里插入图片描述
Commit messages提交可以参照以下格式

<type>: <subject>
<BLANK LINE> 空白行
<body>
<BLANK LINE> 空白行
<footer>
• type: 本次 commit 的类型,诸如 bugfix docs style 等• scope: 本次 commit 波及的范围

• subject: 简明扼要的阐述下本次 commit 的主旨,在原文中特意强调了几点 : . 使用祈使句,是不是很熟悉又陌生的一个词,来传送门在此 祈使句 . 首字母不要大写 . 结尾无需添加标点

• body: 同样使用祈使句,在主体内容中我们需要把本次 commit 详细的描述一下,比如此次变更的动机,如需换行,则使用 |

• footer: 描述下与之关联的 issue 或 break change

Commit Type的类别
• feat: 添加新特性

• fix: 修复bug

• docs: 仅仅修改了文档

• style: 仅仅修改了空格、格式缩进、都好等等,不改变代码逻辑

• refactor: 代码重构,没有加新功能或者修复bug

• perf: 增加代码进行性能测试

• test: 增加测试用例

• chore: 改变构建流程、或者增加依赖库、工具等

Commit messages格式要求
标题行:50个字符以内,描述主要变更内容

主体内容:更详细的说明文本,建议72个字符以内。 需要描述的信息包括:

• 为什么这个变更是必须的? 它可能是用来修复一个bug,增加一个feature,提升性能、可靠性、稳定性等等

• 他如何解决这个问题? 具体描述解决问题的步骤

• 是否存在副作用、风险?

如果需要的化可以添加一个链接到issue地址或者其它文档

来看这个这位老哥在Angular项目详细的commit信息,大家可以对照上面的规范看,可以用一个词描述这种好的Commit方式【“赏心悦目”】,也许这也就是为什么这个项目的Commit会成为众多人模仿的原因吧!
在这里插入图片描述
关于名词简称
软件团队中经常需要Git进行团队协作开发,但是不少职场小宝朋友对于从大佬口中冒出来的一些字母缩略词一脸蒙蔽,比如MR、CR,这里一次说个明白,让你不再迷茫各种简称,哈哈!

这里总结了一些,

• CR:Code Review. 请求代码审查。

• PR: pull request. 拉取请求,给其他项目提交代码。

• MR: merge request. 合并请求

• ACK:Acknowledgement. 承认,同意。表示接受代码的改动。

• TL;DR:Too Long; Didn’t Read. 太长懒得看。常见于README文档。

• WIP:Work In Progress. 进展中,主要针对改动较多的 PR,可以先提交部分,标题或 Tag 加上 WIP,表示尚未完成,这样别人可以先 review 已提交的部分。

• RFC:Request For Comment. 请求进行讨论,表示认为某个想法很好,邀请大家一起讨论一下

Git命令
在文章末尾,分享一下收藏的一个非常全面的Git命令总结,分享给大家!
在这里插入图片描述

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

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

相关文章

AI赋能数据表设计

数据表设计软件用过多种&#xff0c;用Ai 设计表几年Ai大模型爆发之后提升了新的高度 用navicat 设计表就是在跟团队的人介绍这次功能的表结构时&#xff0c;没办法看备注&#xff0c;只能看英文字段&#xff0c;导致在比较复杂的表中&#xff0c;总是在表结构和图形结构中来回…

网络和Linux网络_4(应用层)序列化和反序列化(网络计算器)

目录 1. 重新理解协议 2. 网络版本计算器 2.1 前期封装 Log.hpp sock.hpp TcpServer.hpp 第一次测试(链接) 2.2 计算器实现 第二次测试(序列化和反序列化) 第三次测试(客户端字节流) CalServer.cc CalClient.cc 3. 守护进程 3.1 守护进程和前后台进程 3.1 变成…

zlmediakit实现rtsp流服务器

本次实现是将内存中的H264数据经过zlmediakit实现为rtsp流。 我是用的是CAPI的方式&#xff0c;将zlmediakit作为一个sdk嵌入到自己的程序中而不是作为一个独立的进进程服务。 1.编译完成zkmedialit后会得到bin include lib三个文件夹如图 其中bin中的MediaServer是作为独立的…

二蛋赠书八期:《Java物联网、人工智能和区块链编程实战》

前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术人员都对自己的技能提升和职业发展有着热切的期待。因此&#xff0c;我非常感激大家一直…

常见树种(贵州省):015榧树、秋枫、滇合欢、锥栗、红豆树、刺槐、余甘子、黑荆、槐树、黄檀

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、榧树 …

cocos2dx ​​Animate3D(二)

Twirl 扭曲旋转特效 // 持续时间(时间过后不会回到原来的样子) // 整个屏幕被分成几行几列 // 扭曲中心位置 // 扭曲的数量 // 振幅 static Twirl* create(float duration, const Size& gridSize, const Vec2& position, unsigned int twirls, float amplitude)…

​LeetCode解法汇总2304. 网格中的最小路径代价

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个下…

Tars-GO 开发

默认环境是安装好的 创建服务: tarsgo make App Server Servant GoModuleName Tars 实例的名称&#xff0c;有三个层级&#xff0c;分别是 App&#xff08;应用&#xff09;、Server&#xff08;服务&#xff09;、Servant&#xff08;服务者&#xff0c;有时也称 Object&am…

构造命题公式的真值表

构造命题公式的真值表 1&#xff1a;实验类型&#xff1a;验证性2&#xff1a;实验目的&#xff1a;3&#xff1a;逻辑联结词的定义方法4&#xff1a;命题公式的表示方法5&#xff1a;【实验内容】 1&#xff1a;实验类型&#xff1a;验证性 2&#xff1a;实验目的&#xff1a…

Python满天星

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://want…

Linux 家目录和根目录

摘要&#xff1a; 在 Linux 操作系统中&#xff0c;家目录和根目录是两个非常重要的概念。它们是 Linux 文件系统中的两个关键节点&#xff0c;为用户和系统进程提供存储、管理和访问文件和目录的接口。本文旨在深入探讨和理解这两个目录的结构、功能和使用方式&#xff0c;同时…

C#,《小白学程序》第六课:队列(Queue)其二,队列的应用,编写《实时叫号系统》

医院里面常见的《叫号系统》怎么实现的&#xff1f; 1 文本格式 /// <summary> /// 下面定义一个新的队列&#xff0c;用于演示《实时叫号系统》 /// </summary> Queue<Classmate> q2 new Queue<Classmate>(); /// <summary> /// 《小白学程序…

<C++> 继承

目录 前言 一、继承概念 1. 继承概念 2. 继承定义格式 3. 继承关系和访问限定符 4. 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换 三、继承中的作用域 四、派生类的默认成员函数 五、继承与友元 六、继承与静态成员 七、菱形继承及菱形虚拟继承 1. 菱形继承 2. 虚…

什么是高防IP?有什么优势?怎么选择高防IP?

在当今的互联网环境中&#xff0c;分布式拒绝服务&#xff08;DDoS&#xff09;攻击已经成为一种常见的安全威胁。这种攻击通过向目标服务器发送大量的无效流量&#xff0c;使其无法处理正常的请求&#xff0c;从而达到迫使服务中断的目的。作为一个用户&#xff0c;你是否曾遇…

【Web】PhpBypassTrick相关例题wp

目录 ①[NSSCTF 2022 Spring Recruit]babyphp ②[鹤城杯 2021]Middle magic ③[WUSTCTF 2020]朴实无华 ④[SWPUCTF 2022 新生赛]funny_php 明天中期考&#xff0c;先整理些小知识点冷静一下 ①[NSSCTF 2022 Spring Recruit]babyphp payload: a[]1&b1[]1&b2[]2&…

Go 语言中的 Switch 语句详解

switch语句 使用switch语句来选择要执行的多个代码块中的一个。 在Go中的switch语句类似于C、C、Java、JavaScript和PHP中的switch语句。不同之处在于它只执行匹配的case&#xff0c;因此不需要使用break语句。 单一case的switch语法 switch 表达式 { case x:// 代码块 cas…

【深度学习】如何选择神经网络的超参数

1. 神经网络的超参数分类 神经网路中的超参数主要包括: 1. 学习率 η 2. 正则化参数 λ 3. 神经网络的层数 L 4. 每一个隐层中神经元的个数 j 5. 学习的回合数Epoch 6. 小批量数据 minibatch 的大小 7. 输出神经元的编码方式 8. 代价函数的选择 9. 权重初始化的方法 …

2023.11.24 海豚调度,postgres库使用

目录 海豚调度架构dolphinscheduler DAG(Directed Acyclic Graph)&#xff0c; 个人自用启动服务 DS的架构(海豚调度) 海豚调度架构dolphinscheduler 注:需要先开启zookeeper服务,才能进行以下操作 通过UI进行工作流的配置操作, 配置完成后, 将其提交执行, 此时执行请求会被…

【数据分享】我国12.5米分辨率的DEM地形数据(免费获取/地理坐标系)

DEM地形数据是我们在各种研究和设计中经常使用的数据&#xff01;之前我们分享过500米分辨率的DEM地形数据、90米分辨率的DEM地形数据、30米分辨率的DEM地形数据&#xff08;均可查看之前的文章获悉详情&#xff09;。 本次我们为大家带来的是分辨率为12.5m的DEM地形数据&#…

【反射】简述反射的构造方法,成员变量成员方法

&#x1f38a;专栏【JavaSE】 &#x1f354;喜欢的诗句&#xff1a;更喜岷山千里雪 三军过后尽开颜。 &#x1f386;音乐分享【如愿】 &#x1f970;欢迎并且感谢大家指出我的问题 文章目录 &#x1f384;什么是反射&#x1f384;获取class对象的三种方式⭐代码实现 &#x1f3…