Git进阶系列 | 1. 创建完美的提交

news2024/11/26 23:35:22

Git是最流行的代码版本控制系统,这一系列文章介绍了一些Git的高阶使用方式,从而帮助我们可以更好的利用Git的能力。本系列一共8篇文章,这是第一篇。原文:Creating the Perfect Commit in Git[1]

Git中的提交可以是以下两种情况之一:

  • 可以是出于多种目的所作的各种各样的更改: 用于修复bug的几行代码,尝试重写旧模块,或者实现全新功能的几个新文件。
  • 或者,如果稍微小心一点,就可以帮助我们保持对事情的掌控。可以将提交作为一个仅存放特定类型相关更改的容器,从而使我们更容易理解发生了什么。

本文将讨论如何构建后一种类型的提交,或者换句话说: “完美的”提交。

Git进阶系列:

  1. 创建完美的提交(本文)
  2. Git中的分支策略
  3. 基于Pull Request实现更好的协作
  4. 合并冲突
  5. Rebase vs Merge
  6. 交互式Rebase
  7. Git中的Cherry-pick提交
  8. 用Reflog恢复丢失的提交

为什么整洁、细粒度的提交很重要

真有必要以谨慎、深思熟虑的方式撰写提交吗?就不能只是把Git当作一个无聊的备份系统吗?我们再来回顾一下上面的例子。

如果我们只是遵循第一种选择(只要修改发生,就塞进提交里去),提交就会失去很多价值。提交和提交之间的分隔变得很随意,似乎没有理由将更改放入某一个提交而不是另一个提交中。之后再看这些提交,比如当你的同事试图搞清楚修改了什么,就像在家里翻箱倒柜找东西一样,很难找到想要的东西。

alt

如果我们遵循第二种方式,只在提交中放入相关的内容中,需要制定更多的计划和规则。但最终我们会得到非常有价值的奖励: 干净的提交历史!这些提交可以帮助我们理解发生了什么,有助于以可理解的方式解释复杂的变化。

alt

那怎样才能创建更好的提交呢?

创作更好的提交

在Git中创建更好的提交需要理解一个核心概念: 暂存区(Staging Area)

暂存区正是为了这个目的而创建的,从而允许开发人员以非常细粒度的方式选择应该作为下一次提交的部分更改。而且,与其他版本控制系统不同,Git强制使用暂存区。

然而不幸的是,暂存区仍然很容易被忽略,一次简单的git add .将接受当前所有本地更改,并标记为下一次提交。

的确,有时这是非常有用和有效的方法。但很多时候,我们最好停一下,看一下所有更改是否真的是关于同一个主题,也许选择两次或三次独立提交可能是更好的选择。

大多数情况下,保持较小的提交比保持较大的提交更有意义。专注于单独的主题(而不是两个、三个或四个),往往使提交更容易阅读。

暂存区允许我们仔细挑选每一个应该进入下次提交的更改:

$ git add file1.ext file2.ext

这会只将这两个文件标记为下一次提交,而将其他更改留给将来提交或进一步编辑。

简单停一下,有意识的选择什么应该放到下一次提交,对我们有很大的帮助。但还可以做得更精确一些,因为有时候即使是单个文件中的更改也属于多个主题。

来看一个真实的例子,可以使用“git diff”命令或者像Tower[2]一样的git桌面GUI来查看“index.html”文件中的详细变更:

alt

现在,我们尝试添加给git add添加-p选项:

$ git add -p index.html

该命令指示Git对文件进行“补丁”级别的检查: Git会帮助我们检查文件中的所有更改,然后问我们,对于每个块,是否要添加到暂存区:

alt

我们为第一个块键入Y(表示“是”),为第二个块键入N(表示“否”),可以在下次提交时将该文件的第一部分更改包含进来,但将其他更改留到以后或进行更多的编辑。

测试代码

既然我们谈论的是“完美的提交”,就不能忽视测试这个话题。如何准确“测试”代码当然有不同方式,但是“测试很重要”这一概念已经是老生常谈了。事实上,如果一段代码没有经过适当的测试,许多团队拒绝认为变更已经完成。

还在犹豫是否应该测试自己的代码?让我们澄清一些关于测试的误区:

  • “测试被高估了”: 事实上,测试可以帮助我们更快找到bug。最重要的是,帮助我们在产品投入生产之前找到它们,从而避免误造成最大的伤害。毫不夸张的说,尽早发现漏洞是无价的!
  • “测试花费了宝贵的时间”: 一段时间之后,你会发现编写良好的测试使你编码的速度更快了。测试减少了debug的时间,结构良好的测试也为实际实现做好了准备。
  • “测试是复杂的”: 也许几年前会有这方面的争论,但现在已经不一样了,大多数专业编程框架和语言都对配置、编写和管理测试提供了广泛的支持。

总而言之,将测试作为开发的一部分几乎可以保证能够使我们代码库更加健壮,同时能够帮助我们成为更好的开发者。

有价值的提交信息

使用Git进行版本控制并不是一种备份代码的特殊方式。况且,正如我们已经讨论过的,提交并不是任意更改的转储。提交的存在可以帮助我们及团队成员理解项目中发生了什么,好的提交信息可以更好的确保这一点。

但什么是好的提交信息呢?

  • 有一个简明扼要的主题行(subject line)总结变更
  • 有一个描述性的主体(message body),尽可能简洁的解释了最重要的事实

让我们从主题行开始,目标是获得所发生事情的简要总结。当然,简洁是一个相对概念,一般的经验法则是(理想情况下)将主题控制在50个字符以内。顺便说一下,如果你发现自己很难想出简短的内容,可能表明提交囊括了太多主题!可能值得再去看一看,是否可以把它分成多个单独的提交。

如果用一个换行符和一个额外的空行结束主题,Git就会知道下面的文本是消息的“主体”。在这里,有更多空间来描述发生了什么。正文应该旨在回答这些问题:

  • 提交之后,项目发生了什么变化?
  • 做出这种改变的原因是什么?
  • 有什么特别需要注意的吗?关于这些变化还有什么其他人应该知道的吗?

如果在编写提交消息体时牢记这些问题,就很可能对所发生的事情给出有用的描述,最终会使团队成员(一段时间后也会使我们自己)在试图理解这一提交时受益。

在上面关于提交消息内容的规则之外,许多团队还关心格式: 在字符限制、软或硬换行等方面达成一致,这些都有助于在团队中产生更好的提交。

为了更容易遵守这些规则,我们最近在Git桌面GUI Tower中添加了一些功能: 例如,可以根据自己的喜好配置字符数或自动换行。

alt

优秀的代码库包含大量优秀的提交

任何开发人员都想要让自己的代码库越来越好,但只有一种方法可以实现这个崇高目标: 不断做出优秀的提交!希望我能够证明(a)追求这个目标绝对值得,(b)实现它并不难。

如果想更深入了解高级Git工具,可以免费查看“Advanced Git Kit[3]”: 这是关于分支策略、交互式Rebase、Reflog、子模块等主题的短视频集合。

References:
[1] Creating the Perfect Commit in Git: https://css-tricks.com/creating-the-perfect-commit-in-git/
[2] Git Tower: https://www.git-tower.com
[3] Advanced Git Kit: https://www.git-tower.com/learn/git/advanced-git-kit

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

- END -

本文由 mdnice 多平台发布

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

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

相关文章

jenkins下载gitlab自动化用例并每日批跑

1.安装Jenkins ---待补充 2.安装用例执行节点(虚拟机) 用例执行的虚拟机,需要安装python环境与依赖包(自动化脚本依赖包),需要申请外网权限(安装python依赖需要外网)。执行机需要挂…

四大技巧,教你如何加速手动UI测试

用户界面测试(UI测试)是软件开发过程中的一个重要组成部分。单元测试和集成测试可以确保代码正常运行,UI测试则帮助您确保用户在使用过程中获得最佳体验。这些测试有一个共同的挑战——创建和维护可能非常耗时,尤其是手动测试。 …

vscode配置远程linux开发环境

vscode配置远程linux开发环境 1. linux 要运行sshd服务2. 在vscode上安装Remote Development插件3. 配置远程linux主机的信息4. 远程连接linux 1. linux 要运行sshd服务 使用命令,查看 22端口是否被监听,这个端口是远程连接软件所用到的端口 netstat -…

mysql8.0版本降到5.7版本(下载配置mysql5.7压缩包版本)

目录 一、前言 二、官网下载与解压 三、配置环境变量 四、检查测试当前MySQL版本 五、获取资源 一、前言 在部署项目的时候,有时候8.0版本的MySQL就会报错,这个时候就要换MySQL的版本了,5.7的版本还是比较稳定的。 二、官网下载与解压…

短视频账号矩阵系统sign解密流程(开发)

PHP加密后直接用这个PHP解码如何解密? IOC 控制反转 把创建对象过程交给spring进行管理,降低耦合度 底层原理 xml解析、工厂模式、反射 过程: 使用xml创建对象 使用xml解析技术解析 通过反射创建对象 Class clazz Class.forName(解析出来…

Unity:Gizmos 菜单

推荐:将 NSDT场景编辑器 加入你的3D工具链 3D工具集: NSDT简石数字孪生 Gizmos 菜单 Scene 视图和 Game 视图都有 Gizmos 菜单。 单击 Scene 视图或 Game 视图的工具栏中的 Gizmos 按钮,即可访问 Gizmos 菜单。 “场景”视图中的“辅助图标”…

(提升篇)函数栈帧的创建和销毁

函数栈帧的创建和销毁 1.前言2.预备知识2.1什么是栈帧2.2什么是栈2.2常见的寄存器2.3常见的汇编指令 3.函数栈帧创建和销毁的过程3.1为main函数创建栈空间3.2main函数中创建变量3.3给Add函数传参3.4调用Add函数3.5为Add函数创建栈空间3.6计算3.7把计算好的值返回 1.前言 本章节…

【C/C++数据结构与算法】C语言函数栈帧

目录 一、源代码理论分析 二、主函数的创建 三、c语言代码的汇编 注:不同编译器环境的函数栈帧存在一定差异,本文使用VS2019 一、源代码理论分析 源代码: int Add(int x, int y) {int z 0;z x y;return z; }int main() {int a 10;…

Springboot分布式事务

一、先了解什么是本地事务 1. 概念 本地事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器位于同一节点相同数据库上。 又称为传统事务。它是一个操作序列,这些操作要么都执行,要么都不执行,是一个不可分割的工作单位。例…

【LeetCode】HOT 100(16)

题单介绍: 精选 100 道力扣(LeetCode)上最热门的题目,适合初识算法与数据结构的新手和想要在短时间内高效提升的人,熟练掌握这 100 道题,你就已经具备了在代码世界通行的基本能力。 目录 题单介绍&#…

英特尔发布12Q CMOS量子芯片

光子盒研究院 今天,英特尔公司发布了一种在主流CMOS工艺技术上构建的具有12个量子比特的量子芯片——Tunnel Falls。 Tunnel Falls测试芯片栖息在指尖上 Tunnel Falls量子芯片由12个量子点(或单电子晶体管)构建,可配置4至12个基于…

嵌入式 QT usb camera库驱动摄像头

目录 前言 ​编辑 1. 交叉编译 ffmpeg 1.1 先拿到ffmpeg的压缩包 1.2 把ffmpeg源码复制到虚拟机,并解压压缩包 1.3 解压之后我们要进入到解压文件中进行编译成库 1.5 make 1.6 make install 2.usbcame库使用 2.1 获取usbcame库并解压 2.2 解压完成后我们…

zabbix-3-agent安装

1.CentOS release 5 1-1.centos5 32位 [rootLV zabbix]# cat /etc/redhat-release CentOS release 5 (Final) [rootLV zabbix]# uname -a Linux LV 2.6.18-53.el5xen #1 SMP Mon Nov 12 03:26:12 EST 2007 i686 i686 i386 GNU/Linux确定了系统centos5 32位rpm方式安装&#…

【深度学习】3-1 神经网络的学习- 学习基础/损失函数

学习基础 神经网络的学习。这里所说的“学习”是指从训练数据中自动获取最优权重参数的过程。 神经网络的特征就是可以从数据中学习。所谓“从数据中学习”,是指可以由数据自动决定权重参数的值。 数据驱动 数据是机器学习的命根子。从数据中寻找答案、从数据中发…

接口测试框架之APIAutoTest框架

目录 前言 框架简介 框架介绍 框架技术栈图 框架组件图 框架执行流程图 测试用例设计 测试报告 结语 前言 APIAutoTest框架是一款基于Python语言和unittest框架的API自动化测试框架。它可以帮助测试人员快速搭建API测试环境,并通过代码自动化实现API的测试…

每年降本100万元+!企业研发管理可以这样做....

随着市场的定制化需求越来越多,非标设计越来越多;订单交付周期要求短,导致设计人员的设计周期进一步压缩,设计准确率的重要性进一步提升,这些都对企业研发管理提出了更严峻的挑战。 本期干货内容分享 装备制造企业研发…

计算机网络基础学习指南

前言 计算机网络基础是研发/运维工程师都需掌握的知识,但往往会被忽略。 今天,我将对计算机网络基础学习进行详细阐述,涵盖 TCP / UDP协议、Http协议、Socket等,希望你们会喜欢。 1、计算机网络体系结构 1.1 简介 定义 计算机…

Linux基础学习之目录结构、ls命令

1、win系统可能有多个盘,那么就会对应多个文件树,但是Linux系统只有一个文件树,对应的也只有一个根目录,叫做 / 。 2、win与Linux表示层级关系的斜杠的方向不同,一个是斜杠,一个是反斜杠,Linux…

Three.js3D可视化介绍,以及本地搭建three.js官网

一、什么是Three.js three.js官网:https://threejs.org/ Three.js是一个基于WebGL的JavaScript 3D图形库,它可以轻松地在浏览器中创建3D场景和动画。同时,它支持外部模型和纹理的导入,让开发者可以更加便捷地创建出震撼的3D场景…

详细的聊一聊如何使用响应式图片,提升网页加载速度

开篇 确保图片在所有屏幕尺寸上都能良好显示是一项困难的任务,因为你需要考虑图片的大小、图片的放置位置、显示图片的比例、用户连接的速度等等众多因素。结果是,大多数开发者只会为所有屏幕尺寸使用同一张图片,并让浏览器调整图片的大小以适…