Git指导:提交干净的commit信息

news2024/11/25 8:14:25

为什么我们应该关心编写干净的提交消息?

提交是程序员技术的有形构建块。它们充当代码的锦上添花,如果编写正确,它们会带来巨大的价值。编写良好的提交消息变得不可或缺,因为它们提供了上下文——否则一开始就不需要提交消息。

良好的提交表明开发人员是否是良好的合作者 - Peter Hutterer,Linux。

开发人员中的一个常见错误是将 Git 存储库视为备份系统。随机承诺捕获代码的当前状态可能会妨碍您在将来检查代码库时理解过去更改的能力。提交诸如“WIP”、“吃午餐”、“今天代码结束”、“我累了 AF”、“团队周末快乐”和“首先提交”之类的消息只会让你的 Git 日志变得混乱,让你的工作变得困难。了解您所做的重要承诺,因为这些消息都不包含任何附加价值。

以下是尝试提交到远程存储库时要避免的一些关键错误

切勿分别对不同文件提交更改

在查看提交历史记录或与其他团队成员协作时,单独提交对不同文件的更改可能会导致出现问题。理解变化的完整背景及其相互关系变得具有挑战性。

例如,我正在建立一个网上商店。我不应该做的是:

# Committing changes to header.js separately
git add header.js
git commit -m "Improve header layout"

# Committing changes to footer.js separately
git add footer.js
git commit -m "Optimize footer design"

查看您的 Git 日志,这种提交结构可能会变得混乱,尤其是随着您的提交历史记录的增长。

提交应该清晰、简洁并组织成逻辑单元。例如,完成代码的布局部分并处理页眉和页脚部分后,在提交这些更改之前完成这些更改后,合并这些更改会更清晰:

# Staging changes to both header.js and footer.js
git add header.js footer.js

# Committing related changes together
git commit -m "Enhance UI: Header and Footer Improvements"

我知道这在理论上听起来可能比在实践中容易。这就是为什么在通过压缩将这些更改合并到主分支之前,维护一个专门用于提交的私有分支是一个很好的做法。

为私有提交创建专用分支

提交代码并不一定意味着它必须成为无尽的 git 日志中的永久固定装置。将私人分支机构视为您个人程序员的画板 - 您可以自由地进行实验,而不必担心其他人审查您的工作。

想象一下场景:您正在编码,需要暂时离开一下,或者您可能要去吃晚饭。对失去当前进度的恐惧促使您提交更改 - 私人分支机构的完美用例。无论您是要结束当天的编码会议还是只是想进行自发的提交,这些更改都可以在您的私人分支中找到它们的家。

commit [commit-hash]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]
    WIP

commit [commit-hash]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    commiting before i eventually lose my files

commit [commit-hash]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    about to go for dinner

commit [commit-hash]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    toilet time!

在协作环境中,使私有分支的命名显而易见非常重要。因为您不能让此类提交消息出现在您的公共分支中。

无论是通过明确的分支命名还是与队友直接沟通,都要明确表明该分支的内容并不旨在作为正在进行的工作的基础。私有分支的一个好命名可以是:“private/do-not-use-this”

成为公共分支一部分的每个提交都必须体现一个精心设计、独立、可逆且描述良好的工作单元。

案例研究:开发在线商店的购物车功能

让我们看一下我们一直在开发的在线商店项目。在这种情况下,您作为前端开发人员,负责向商店添加购物车功能。您的旅程将按如下方式展开:

您通过增强购物车部分的 CSS 呈现方式开始了努力,并做出了相应的提交。随着您的进步,您向购物车引入了 JavaScript 功能,从而导致了另一次提交。在追求完美的过程中,您注意到文本对齐问题并投入时间来完善 CSS,然后进行了额外的提交。

继续您的工作,您发现并解决了与将产品添加到购物车时计数器行为相关的错误。这个快速修复也在提交中得到了体现。最后,您试图通过在单击结帐按钮时合并加载动画来提升用户体验,并以结论性提交作为结束。

现在我们看一下git日志:

commit [commit-hash-1]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    Enhance CSS presentation of cart section

commit [commit-hash-2]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    Introduce Javascript functionality to cart

commit [commit-hash-3]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    Refine CSS to resolve text alignment issue

commit [commit-hash-4]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    Fix counter bug related to cart behavior

commit [commit-hash-5]
Author: Your Name <your.email@example.com>
Date:   [Timestamp]

    Incorporate loading animation for checkout button

如果这些更改需要与与在线商店相关的其他提交一起纳入主要功能分支,则审核过程可能会变得具有挑战性。

这是修复这些提交日志的方法

首先切换到您的功能分支:

# Checkout the feature branch named feature/cart-section
git checkout feature/cart-section

然后,将分支中的所有提交压缩private/do-not-use-thisfeature/cart-section使用单个提交消息:

# Merge and squash all commits from the private branch to the feature branch using a single commit
git merge - squash private/do-not-use-this

合并和压缩后,您需要制作一条清晰且描述性的提交消息:

编写完美提交消息的 7 个标准规则

这些规则提供了指南和最佳实践,以确保您的提交消息格式正确并传达清晰的信息。虽然具体规则可能因不同来源而异,但总体目标是增强 Git 版本控制系统内提交消息的可读性和可理解性。

规则 1:限制为 50 个字符(最多)。

在设计提交消息的主题行时,建议保持简洁和重点突出。主题行用作提交目的的快速摘要,理想情况下应限制为最多 50 个字符。

难以满足 50 个字符的限制可能表明提交的意图不够明确。提交消息应该清晰、简洁并且能够独立存在。通过遵守此字符限制,您将被迫优先考虑最关键的信息,从而使您的团队和未来的您更容易一目了然地了解变更的性质。

规则 2:仅将主题行的第一个字母大写。

撰写提交消息时,请使用标题大小写,将主题行的第一个字母大写,就像编写简洁的句子一样。将消息的其余部分(包括任何其他详细信息)保留为小写。

规则 3:不要在主题行末尾添加句号

主题行不以句点结束的原因部分是历史原因,部分是为了保持一致的风格。惯例是将主题行视为标题或命令,这就是为什么它以祈使语气编写(例如,“添加功能”或“修复错误”而不是“添加功能”或“修复错误”)。省略末尾的句号有助于强化这一惯例并保持主题行简洁。

git commit -v -m "Create the Cart Feature with a Nice Animation"

规则 4:在主题行和正文之间放置一个空行

虽然该指南可能看起来不寻常,但它植根于实用性。许多开发人员使用 Git 命令行界面,但该界面通常缺乏自动换行功能。因此,引入了有意的格式化规则,以确保一致且清晰的提交消息。

git commit -v -m "Create the Cart Feature with a Nice Animation

Body...
"

规则 5:提交正文在 72 个字符处换行

需要澄清的是,遵守本指南并不涉及传统的自动换行;而是涉及传统的自动换行。相反,这种做法是因为考虑到命令行用户可能会遇到超过 72 个字符的截断提交正文。

大多数时候,您的消息长度会超过 72 个字符。在这种情况下,建议中断文本并在下一行继续您的句子,如下面的提交消息所示:

git commit -v -m "Create the Cart Feature with a Nice Animation

Enhanced the CSS layout of the cart section, addressing text
alignment issues and refining the layout for improved aesthetics
and readability."

总之,表示要点的标准做法是使用连字符或星号,后跟一个空格。此外,保持悬挂缩进以提高组织清晰度也很重要。

规则 6:使用祈使语气

一个有价值的实践涉及在编写提交消息时具有基本的理解,即提交在实施时将实现精确的操作。以逻辑上完成句子“如果应用,此提交将......”的方式构建提交消息。例如,不要git commit -m "Fixed the bug on the layout page"使用 ❌,而是使用这个git commit -m "Fix the bug on the layout page"

换句话说,如果应用此提交,确实可以修复布局页面上的错误。

规则 7:解释“什么”和“为什么”,但不解释“如何”。

将提交消息限制为“内容”和“原因”,可以为每个更改创建简洁而信息丰富的解释。寻求“如何”实现代码的开发人员可以直接参考代码库。相反,突出显示更改的内容以及更改的理由,包括受影响的组件或区域。

案例研究:Angular 的提交消息实践

Angular 是有效提交消息传递实践的一个突出例证。Angular 团队提倡在制作提交消息时使用特定的前缀。这些前缀包括“chore:”、“docs:”、“style:”、“feat:”、“fix:”、“refactor:”和“test:”。通过合并这些前缀,提交历史记录成为了解每次提交性质的宝贵资源。

提示

请记住通过提交消息优先考虑清晰且有意义的沟通。精心设计的提交消息就像一个故事,解释“什么”、“为什么”,但不解释“如何”进行更改。请记住,您的提交历史记录是您和您的团队未来将依赖的协作资源。养成创建内容丰富、简洁且一致的提交消息的习惯。

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

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

相关文章

windows 远程连接 ubuntu桌面xrdp

更新 sudo apt update安装组件 sudo apt-get install xorg sudo apt-get install xserver-xorg-core sudo apt-get install xorgxrdp sudo apt install xfce4 xfce4-goodies xorg dbus-x11 x11-xserver-utilsxrdp sudo apt install xrdp sudo systemctl status xrdp sudo …

证件照快速抠图更换背景 - Python OpenCV图像分割

需要更换证件照的背景&#xff0c;大多软件App直接收费或者需要支付后才可去水除印&#xff0c;本文公开不收费&#xff0c;欢迎使用&#xff0c;代码可在IDE如PyCharm或者Linux上直接运行&#xff0c;程序会自动安装依赖库OpenCV&#xff0c;如果觉得不错随手点个赞哦 &#x…

美客多平台运营策略揭秘,卖家如何实现安全稳定的测评!

要在美客多平台上取得成功&#xff0c;卖家需要具备一定的运营策略。本文将为大家分享一些关键的运营策略&#xff0c;帮助卖家在美客多平台上实现可持续发展。 一&#xff1a;优化商品页面&#xff0c;提升转化率 在美客多平台上&#xff0c;商品页面是吸引用户注意力的关键。…

c++中的map和set

文章目录 1. 关联式容器2. 键值对3. 树形结构的关联式容器3.1 set3.1.1 set的介绍3.1.2 set的使用 3.2 map3.2.1 map的介绍3.2.2 map的使用 3.3 multiset3.3.1 multiset的介绍3.3.2 multiset的使用 3.4 multimap3.4.1 multimap的介绍3.4.2 multimap的使用 1. 关联式容器 在初阶…

pycharm配置远程服务器

1.首先在服务器的一个位置创建一个文件夹 作为我们的工作文件夹&#xff0c;这里就命名为hhr。 2.配置我们的解释器 &#xff08;实验室服务器python环境都配好了&#xff0c;我们只需要找到就可以了&#xff09;&#xff0c;这里可以连上Xhell之后输入python打开python解释器…

网工内推 | IT高级运维工程师,周末双休,包吃包住,14-20k

01 深圳朗特智能控制股份有限公司 招聘岗位&#xff1a;IT高级运维工程师 职责描述&#xff1a; 1、对集团网络基础架构的建设、运维、安全制定相关标准和准则&#xff1b; 2、负责集团数据中心、核心设备、信息安全的管理和运维&#xff1b; 3、执行网络、服务器、核心交换机…

【已解决】Operation timed out 问题

概述 今天遇到了这样一个有点奇葩的问题&#xff0c;再阿里云服务器上部署了Mysql服务&#xff0c;再使用NaviCat的过程中链接不上&#xff0c;connect to address IP地址: Operation timed out&#xff0c;最后是服务器防火墙的问题。 查看Mysql服务/端口 1.查看Mysql是否启…

解决loadDep:omelette: sill install loadAllDepsIntoIdealTree

报错信息如下&#xff1a; 解决方案&#xff1a; 1、设置为淘宝的镜像源 npm config set registry https://registry.npm.taobao.org 2、 命令检验是否成功 npm config get registry 3、继续运行npm install即可 npm install 运行效果&#xff1a;

C/C++ 中的函数返回局部变量以及局部变量的地址?

C/C中&#xff0c;函数内部的一切变量(函数内部局部变量&#xff0c;形参)都是在其被调用时才被分配内存单元。形参和函数内部的局部变量的生命期和作用域都是在函数内部(static变量的生命期除外)。子函数运行结束时&#xff0c;所有局部变量的内存单元会被系统释放。在C中&…

帮助文档Api

帮助文档Api 按照帮助文档的使用步骤学习Scanner类的使用&#xff0c;并实现键盘录入一个字符串&#xff0c;最后输出在控制台 部分Scanner的api文档如下&#xff1a; package com.api.Demo01;// 需要导入 Scanner包 import java.util.Scanner;public class Test01 {public sta…

千兆以太网传输层 UDP 协议原理与 FPGA 实现(UDP接收)

文章目录 前言心得体会一、 UDP 协议简单回顾二、UDP接收实现三、完整代码展示四、仿真测试(1)模拟电脑数据发送,(2)测试顶层文件编写(3)仿真文件(4)仿真波形前言 在前面我们对以太网 UDP 帧格式做了讲解,UDP 帧格式包括前导码+帧界定符、以太网头部数据、IP 头部数…

Ride基本使用

基本使用步骤&#xff1a; 创建项目(New Project)创建模块(New Directory)创建测试套件(New Suite)创建测试用例(New Test Case)创建资源文件(New Resource)创建业务关键字(New User Keyword)常用关键字用例编写robot报告显示 创建项目(New Project) File --> New Project…

程序无法启动,提示“找不到msvcp140.dll”或“msvcp140.dll缺失报错”解决方法

大家好&#xff01;今天我来给大家分享一下msvcp140.dll丢失的解决方法。我们都知道&#xff0c;在运行一些软件或游戏时&#xff0c;经常会遇到“找不到msvcp140.dll”的错误提示&#xff0c;这会让我们非常苦恼。那么&#xff0c;这个问题该怎么解决呢&#xff1f;下面我将为…

如何理解分布式锁?

分布式锁的实现有哪些&#xff1f; 1.Memcached分布式锁 利用Memcached的add命令。此命令是原子操作&#xff0c;只有在key不存在的情况下&#xff0c;才能add成功&#xff0c;也就意味着线程得到了锁。 2.Reids分布式锁 和Memcached的方式类似&#xff0c;利用Redis的setn…

“益路同行”栏目专访第12期——泰格智能AI英语·李勤骞老师

中国善网在本届&#xff08;第十届&#xff09;慈展会上特别推出了《益路同行》采访栏目&#xff0c;《益路同行》栏目旨在寻觅公益之路上同行者的故事&#xff0c;挖掘公益更深层次的内涵&#xff0c;探索新时代公益发展道路。希望公益企业、人物、故事被更多人看到&#xff0…

HEC-RAS 1D/2D水动力与水环境模拟技术案例实践及拓展应用

水动力与水环境模型的数值模拟是实现水资源规划、环境影响分析、防洪规划以及未来气候变化下预测和分析的主要手段。然而&#xff0c;一方面水动力和水环境模型的使用非常复杂&#xff0c;理论繁复&#xff1b;另一方面&#xff0c;免费的水动力和水环境软件往往缺少重要功能&a…

蓝桥杯 字符串和日期

有一个类型的题目是找到输出图形的规律&#xff0c;然后将其实现。观察下面的图形。你想想你该怎么输出这个图形呢? ABBB#include<stdio.h> int main(){printf(" A\n");printf("BBB\n");return 0; }那么&#xff0c;对于如下的图形&#xff1a; ABB…

9 家用热水器用户行为分析与事件识别

第9章 家用热水器用户行为分析与事件识别 9.1 了解家用热水器用户行为分析的背景与步骤9.1.1 热水器采集数据基本情况9.1.2 熟悉家用热水器用户行为分析的步骤与流程 9.2 预处理热水器用户用水数据9.2.1 删除冗余特征9.2.2 划分用水事件9.2.3 确定单次用水事件时长阈值9.2.4 代…

C++并发与多线程(4) | 传递临时对象作为线程参数的一些问题Ⅰ

一、陷阱1 写一个传递临时对象作为线程参数的示例: #include <iostream> #include <vector> #include <thread> using namespace std;void myprint(const int& i, char* pmybuf) {cout << i << endl;cout << pmybuf << endl;r…

Python 无废话-基础知识列表list详讲

本文详细的介绍了在Python中如何处理list数据类型&#xff0c;涉及了Python 基础知识列表list 详讲&#xff0c;包含list 定义、遍历循环、元素获取、切片、添加、删除、查找元素&#xff0c;以后列表在函数、copy中使用。 列表List数据类型 列表特征 1) 列表中的各个元素&…