好的提交 VS. 坏的提交 :Git 的最佳实践
在软件或网页开发的精彩世界中,版本控制是每个与其他开发者合作项目的开发者必备的工具。Git 是最常用的版本控制系统之一,它帮助开发者跟踪变更、有效地回到之前的状态,并在项目中进行团队协作。但是,Git 的工作只有在正确管理提交时才能发挥效果。在本文中,我们将讨论那些好的和坏的提交,向您解释如何拥有一个清晰、信息丰富、有帮助的提交历史的最佳实践。
什么是提交?
在 Git 中,提交指的是您的代码在特定时间点的状态。提交包含元数据(作者、时间戳、提交信息等)。提交用于保存进度、声明更改和将开发的部分与他人的工作合并。
好的提交的特征
原子性和专注性:提交应该是原子的 - 它必须只代表一个逻辑变更。不要在一个提交中混合几个独立的更改。
例子:
# 好的提交 git commit -m "添加用户认证" # 坏的提交 git commit -m "添加用户认证并更新UI样式"
描述性的提交信息:描述性的提交信息清楚地解释了提交做了什么以及为什么进行这个更改。它应该为他人(和未来的自己)提供足够的上下文来理解这个更改,而无需阅读代码。
例子:
# 好的提交信息 git commit -m "修复:纠正用户登录中的空指针异常" # 坏的提交信息 git commit -m "修复bug"
遵循约定式提交指南:您可以使用标准的提交指南来保持您的 git 历史整洁、一致且易于阅读。通常这些指南以类型(feat、fix、chore、refactor、docs)、简短摘要以及偶尔的长解释或对其他相关问题的引用的形式呈现。
例子:
# 遵循约定式指南的好的提交信息 git commit -m "feat(auth): 添加基于JWT的认证" git commit -m "fix(login): 解决登录流程中的竞态条件"
经过测试和验证:确保您的提交中的更改已经过测试,并且正常运行。破损/未经测试的代码可能会影响工作流程和其他成员。
适当的范围:适当地确定您的提交范围。例如,如果您正在开发特定功能或修复bug,确保与该任务相关的所有更改都包含在一个单独的提交中。避免可能使代码库处于不一致状态的部分更改。
例子:
# 范围适当的好的提交 git commit -m "refactor(auth): 将认证逻辑拆分为单独的模块" # 范围混杂的坏的提交 git commit -m "重构和小修复"
坏的提交的特征
庞大且不专注:包含太多更改的提交是一个坏的提交。它使人难以理解提交做了什么。庞大、不专注的提交难以审查和调试。
例子:
# 坏的提交 git commit -m "更新项目"
模糊或误导性的信息:模糊或误导性的提交信息不提供有关更改的有用信息。这种细节的缺失可能导致混淆,并使跟踪更改的历史变得困难。
例子:
# 坏的提交信息 git commit -m "东西"
不相关的更改:将不相关的更改组合到一个提交中,使得隔离特定更改变得困难,可能引入bug并使审查过程复杂化。
例子:
# 坏的提交 git commit -m "更新readme并修复登录问题"
不完整或未测试的代码:提交不完整或未测试的代码可能会扰乱工作流程,给其他团队成员造成问题,并可能破坏构建。
缺乏上下文:一个坏的提交通常缺乏上下文,使人难以理解为什么进行了更改。这可能导致混淆,并在未来重新审视代码时产生困难。
好的提交的最佳实践
经常提交,但不要太频繁:在提交太频繁和不够频繁之间寻求平衡。每个提交应该代表一个有意义的更改。永远不要在一个提交中推送不相关的更改。
编写清晰和描述性的信息:您的提交信息应该解释提交做了什么以及为什么进行这个更改。
有效使用分支:使用功能分支进行新功能、bug修复和实验。为这些分支提出拉取请求,项目经理或管理员将审查您的代码并将其合并到主分支中。
审查和压缩提交:如果您是项目所有者、领导、管理员或审查代码的人,在合并分支之前,审查并压缩小的或修复性的提交为逻辑单元。这种做法保持提交历史整洁且易于跟踪。
自动化测试:使用持续集成工具在每次提交时自动测试您的代码。这确保您的更改得到验证,并减少引入bug的风险。
使用Husky:使用像husky这样的库可以提升您的git技能。如果您违反了在husky中配置的规则,它不允许提交。
结论
好的提交对于在Git中维护一个清晰和可理解的项目历史很重要。通过遵循最佳实践,如保持提交的原子性、编写描述性信息、确保更改经过测试,您可以改善协作并使您的项目更易于维护。一个管理良好的提交历史对于您未来的自己、您的团队或新的合作者来说是一个无价的资源。
通过遵循上述指南,您将使项目中涉及的每个人都更容易理解、审查和构建您的工作。祝提交愉快!
相关文章:
好的提交 VS. 坏的提交 :Git 的最佳实践
在软件或网页开发的精彩世界中,版本控制是每个与其他开发者合作项目的开发者必备的工具。Git 是最常用的版本控制系统之一,它帮助开发者跟踪变更、有效地回到之前的状态,并在项目中进行团队协作。但是,Git 的工作只有在正确管理提…...

MySQL第4讲--图像化界面工具DataGrip介绍
文章目录 前言DataGrip的下载DataGrip安装DataGrip连接数据库DataGrip使用创建数据库创建表修改表 DataGrip中编写SQL语句操作数据库 前言 在第二讲MySQL第2讲–关系型数据库以及SQL语句分类之DDL数据库和表的操作和第三讲MySQL第3讲–数据类型和表的修改和删除的介绍当中所有的…...
Curl工具小记
curl 是一个非常强大且灵活的命令行工具,用于获取或发送数据,无需用户图形界面交互。它支持多种协议,并且可以在脚本中使用,以实现自动化任务。 基本介绍 curl 是 “Client URL” 的缩写,它是一个利用 URL 语法在命令…...

【C#语音文字互转】C#语音转文字(方法一)
Whisper.NET开源项目:https://github.com/sandrohanea/whisper.net/tree/main 一. 环境准备 在VS中安装 Whisper.net,在NuGet包管理器控制台中运行以下命令: Install-Package Whisper.net Install-Package Whisper.net.Runtime其中运行时包…...
基于Linux系统下的在线手机商城
项目背景 随着网络的发展,电子商务的兴起和普及使得消费者越来越倾向于通过互联网购买商品和服务,越来越多的传统零售商和新兴企业转向在线销售以满足消费者的需求,个成功的在线商城项目背景包括对市场需求、竞争环境、技术和平台选择、商业…...
Apache Kafka 事务详解
Apache Kafka 事务详解 Apache Kafka 是一个分布式流处理平台,主要用于实时数据的传输和处理。在现代的数据密集型应用中,事务性保证在数据传输和处理中的作用至关重要。本文将详细介绍 Kafka 的事务性支持,包括其基本概念、架构、使用方法以…...
Go语言 结构体
本文主要为Go语言 结构体介绍、语法、使用注意及其示例。 目录 结构体 语法 语法示例 语法说明 声明使用 创建并赋值 使用指针 使用注意 总结 结构体 C语言里面,我们可以使用typedef in MyInt。 在go语言中使用结构体来模拟类,使用type stru…...

数据结构(邓俊辉)学习笔记】词典 03—— 排解冲突(1)
文章目录 1. 一山二虎2. 泾渭分明3. 开放定址4. 线性试探5. 赖惰删除 1. 一山二虎 此前我们已经多次指出,对于需要动态维护的散列表冲突是不可避免的,无论你的散列函数设计的有多么精妙,因此我们不得不回答的第二个重要问题就是一旦发生冲突&…...
HTML5+CSS3-HTML5入门
1.web标准 W3C为web标准化做出了以下事项,主要包括结构,表现和行为。 结构用于对网页的信息进行分类和整理,使用技术包括HTML,XML,XHTML 表现指网页的外在样式,一般包括网页的版式,颜色,字体,…...

谷粒商城实战笔记-138-商城业务-首页-渲染二级三级分类数据
本节的主要内容是在前一节的基础上,提供结构查询出所有的二级、三级分类数据。 一,构造响应体数据结构 后端返回给前端的数据结构是在开发详细设计中应该确定的内容。 分析前端需要的数据结构,后端要将所有一级分类包含的二级和三级分类信…...
git的基础用法
文章目录 前言关联仓库提交代码分支操作账号免密 前言 记录一下git的一些基础用法。 关联仓库 # 初始化 git init# 关联仓库 git remote add origin <仓库地址># 查看当前关联的仓库 git remote -v# 一次只能remote一个,要换需要先删原来的 git remote rem…...

常见中间件漏洞(四、Apache合集)
目录 四、Apache 4.1 CVE-2021-41773 漏洞简介 影响版本 环境搭建 漏洞复现 四、Apache 4.1 CVE-2021-41773 Apache HTTP Server 路径穿越漏洞 漏洞简介 该漏洞是由于Apache HTTP Server 2.4.49版本存在目录穿越漏洞,在路径穿越目录<Directory/>Require all gra…...
HCIE-学习笔记
动态授权加入的成员优先级高于静态绑定的成员; any组(缺省):所有用户或资源,通常用来配置默认规则。any组只能做目的组,不支持配置为源组。 同一个安全组既可以与多条授权规则绑定来表示动态用户࿰…...
【计算机网络】性能指标-带宽和时延(MB、GB、KB、B、byte、bit、Mb/s、Gb/s、b/s等)学习
文章目录 1、单位换算MB、b/s1.1 在计算机领域,大写的B、K、M、G表示1.2 在通信领域,小写的k代表的是1000,不是1024,转换的时候要注意区分 2、带宽3、时延(时间消耗)4、时延带宽积5、往返时延RTT 1、单位换算MB、b/s …...
ANN(Approximate Nearest Neighbor)搜索和索引库到底是什么?
🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ ANN(Approximate Nearest Neighbor)搜索:最近邻搜索是一种在大规模数据集中快速找到与给定查询数据点距离最近的点的算法。与传统的精确最近邻搜索算法相比ÿ…...

勒索软件、供应链攻击等带来的思考!
2023年勒索软件、供应链攻击、地缘政治冲突与黑客活动主义、国家黑客间谍与APT组织活动成为网络安全的热点话题,生成式人工智能技术的武器化更是给动荡的全球网络安全威胁态势增加了不确定性、不对称性和复杂性。 即将到来的2024年,随着网络犯罪的规模化…...

【Nuxt】自定义插件和生命周期
自定义插件 方式一: app.vue // 创建插件(在app.vue中创建全局可以使用 而在某个页面中创建只有该页面可以使用) // 方式一: const nuxtApp useNuxtApp(); nuxtApp.provide("formDate", () > {return "2023-12-12"; }) nuxtAp…...

MySQL的简单介绍
文章目录 数据库关系型数据库非关系型数据”数据库的概念和用途MySQL数据库服务器、数据库和表的关系数据库的创建和删除表创建表修改常见的数据类型和约束字符串类型日期和时间类型PRIMARY KEY使用AUTO_INCREMENT使用UNIQUE使用FOREIGN KEY使用 SQL语言基础SQL语言简介SQL分类…...

leetcode 116.填充每个节点的下一个右侧结点指针
1.题目要求: 给定一个二叉树:struct Node {int val;Node *left;Node *right;Node *next; } 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。初始状态下,所有 ne…...

『 Linux 』网络基础
文章目录 协议分层OSI 七层模型TCP/IP 四层(五层)模型网络协议栈与操作系统的联系报文TCP/IP 通讯过程以太网通信的过程以太网的数据碰撞 协议分层 协议分层是计算机网络中奖网络协议进行组织和管理的方法; 通过将网络通信过程分成多个层次,每个层次负责特定的功能从而简化网络…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...

【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...

QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...