好的提交 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 通讯过程以太网通信的过程以太网的数据碰撞 协议分层 协议分层是计算机网络中奖网络协议进行组织和管理的方法; 通过将网络通信过程分成多个层次,每个层次负责特定的功能从而简化网络…...

XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
LRU 缓存机制详解与实现(Java版) + 力扣解决
📌 LRU 缓存机制详解与实现(Java版) 一、📖 问题背景 在日常开发中,我们经常会使用 缓存(Cache) 来提升性能。但由于内存有限,缓存不可能无限增长,于是需要策略决定&am…...

Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
python爬虫——气象数据爬取
一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用: 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests:发送 …...

FFmpeg avformat_open_input函数分析
函数内部的总体流程如下: avformat_open_input 精简后的代码如下: int avformat_open_input(AVFormatContext **ps, const char *filename,ff_const59 AVInputFormat *fmt, AVDictionary **options) {AVFormatContext *s *ps;int i, ret 0;AVDictio…...