如何做一份干净的git提交记录

news2025/1/15 17:25:15

背景

毕业工作有一些年头了,之前在写工作代码或者给开源项目贡献的时候,提交代码都不是很规范,甚至可以说十分的随意,想到什么就提交什么,根本没有管理提交记录的概念或者想法(当你身边的人都不怎么在意的时候,你也很难在意的)。工作了一段时间之后,对代码提交规范的要求高了不少,因为我发现,当我把这件事情做好的时候,会让工作变得顺畅一些。有一天解决倒腾git解决了一些问题,就想到把这些东西沉淀下来,分享出去。所以写下了这篇文章。倒也不是多么高大上的代码技巧或者炫技,只是分享之前遇到的一些git commit问题,和分享一些见解。

cases and thoughts

1. 处理业务开发代码和测试联调代码

想象一下这样一个场景:有一个需求开发完了,准备和其他同事联调这个需求。谨慎起见,联调期间希望可以观测到这个需求运行过程中的大部分细节。比如上下游的输入输出是什么样的,运行到某段代码他的表现应该是什么样的。如果没有测试到位,就上线了,一不小心造成了什么事故,问题可就大了。另外,如果在测试过程中遇到了肉眼看不出来的bug,这时候也需要打一些日志去分析。
这个时候问题就来了,调试日志代码一般情况下是不能上线的,毕竟一个系统在关键的地方打上日志方便线上排查bug就好,到处打日志估计服务器也很难顶得住。这个时候怎么办呢?我会通过下面的例子来演示下面解决的方法。
首先我们假设有一个仓库。叫做git-experiment.并且当前有一个提交,是一个名为Feature-1的需求的相关开发改动。通过查看git提交日志我们可以看到:
image-20230623172359302
下面让我们看看具体怎么解决这个问题。

1.1 直接在这个分支上写,merge进master之前去掉这些提交记录

第一个做法其实比较好理解,就直接在原来的分支上加嘛,测试完了把这些关于测试的提交记录去掉就好。下面这幅图模拟的情景是:

  1. 加上了打印log逻辑。
  2. 在测试中发现了问题,又添加了一个commit来修复这个bug。
    image-20230623172557907
    测试结束,这个时候我们看到上面这样一份提交记录,应该怎么办呢,用git revert?是不太行的喔,因为revert会生成一个新的提交记录。像下面这样子。
    image-20230623175716868
    这样子虽然代码没了,但是这份提交记录看起来就会很奇怪。很明显,在这个场景中,我们实际上只需要关于Feature-1代码改动和关于bug fix的代码改动。这个时候推荐用git rebase。比如在上面这个case中,可以运行:
git rebase -i HEAD~2

这时候我们将看到下面这个景象,这些你挑选好的commit会倒序排列在你面前让你操作。
image-20230623181437659
d代表要放弃这个commit,pick代表保留。确认好你的操作之后退出。可能会遇到代码冲突,解决冲突之后可以执行git rebase --continue。完事之后我们可以看到。
image-20230623181551019
Perfect,这就是我们想要的。但是,这个方法的缺点就是在原来的分支上引入了新的不确定性,并且在去除日志代码的时候,最好期待没有冲突出现,如果出现了冲突,一个不小心把业务需求的代码搞掉了,那就美滋滋了。这种做法相当于把所有的风险都集中在一个分支上面。

1.2 切换一个分支,在新分支上写测试相关的代码

这里介绍第二种方法。我们可以在原来的基础上切换出一个新的分支来,专门用来做测试相关的工作,原有的分支专注在业务开发和bug fix。
image-20230623184507882
然后给这个分支加上测试相关的日志打印代码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-image-20230623185128561

这时候可以看一下这个分支上面的提交日志。
image-20230623185158854

这时候我们就可以拿这个分支去部署,然后和别人联调测试了。如果在测试过程中发现了bug,需要修复怎么办?这个好办,在原来的分支上做bug fix,然后测试分支cherry-pick bug fix的commit就好了。让我们来看看。

image-20230623185610302

commit bug fix的代码后,切换到测试分支,cherry pick这个commit。

image-20230623190717668

有冲突解决冲突。弄完之后让我们来看看这个分支的log。

image-20230623190652166

这样你就可以继续用这个分支做bug fix之后的测试啦。这样做的好处就是,你的开发分支始终是安全且干净的。冲突都在测试分支解决。

2. 让每一个commit都有意义

相信大家都听过这样的一句话,“代码是写给人看的,其次它能在电脑上跑起来。”。无论是工作还是开源项目。如果你写的代码会给别人仔细的review,那么让别人知道你的代码代表什么,要做什么,就显得尤为关键。不要因为做这个需要时间就不去做,如果别人没看懂你的commit或者需要你修改一下commit信息,这些现在省下来的时间后面还是会还回去的。就比如上面这个例子的最终状态是这样的:

image-20230623181551019

实际上,我个人认为这两个commit应该合并成一个,其实看代码的人看到这个bug fix的commit还会好奇这个提交的上下文是什么,可能脑海里会涌现出这样一个问题:bug是什么?不要让别人想太多,如果他很困惑,他就会来问你。最好可以通过commit信息告诉他你做了什么。

说到这里你就会想了,我把所有代码都弄成一个commit,再给上比较好的commit信息是不是就好了。看情况吧,如果一个需求你写了好多代码,上千行这样子。这时候我认为应该拆分一下commit,比如这个时候你可以拆分成好几个小的commit,再分别给提供commit信息。看代码的人可以通过你的commit信息拆解你的需求,细分到每一个小需求去审视你的代码,这也节约了他人的时间。

总结

上面是在我在工作中遇到的一些关于代码提交的问题和想法, 在这里分享给到大家。希望对大家有所帮助。

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

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

相关文章

基于SpringBoot+SpringCloud+vue的智慧养老平台设计与实现

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

大数据企业开发全套流程

大数据企业开发基础流程 Linux命令 1 Hadoop(HDFSYarn)单机版环境搭建 Hadoop 是一个开源的分布式计算框架,由 HDFS(Hadoop Distributed File System)和 YARN(Yet Another Resource Negotiator)两个核心组件组成。HD…

网络安全的含义及特征

网络安全从其本质上讲就是网络上的信息安全,指网络系统的硬件、软件及数据受到保护。不遭受破坏、更改、泄露,系统可靠正常地运行,网络服务不中断。从用户的角度,他们希望涉及到个人和商业的信息在网络上传输时受到机密性、完整性…

人人都能看懂的Spring源码解析,spring的事件监听机制

人人都能看懂的Spring源码解析,spring的事件监听机制 原理解析事件监听机制ApplicationEventPublisher、ApplicationEventMulticaster、ApplicationEvent、ApplicationListenerAbstractApplicationContext发布的事件类型 代码走读总结 往期文章: 人人都…

大数据Doris(四十八):Steam Load案例和注意事项

文章目录 Steam Load案例和注意事项 一、Steam Load案例 1、准备数据 2、创建 Doris 表 3、创建 Stream Load 导入任务 4、查看任务 5、查询Doris 表结果 二、注意事项 Steam Load案例和注意事项 一、Steam Load案例 下面以导入Linux节点本地磁盘数据到Doris为例&…

Python小游戏集合(开源、开源、免费下载)

Python小游戏集合 0. 前言1. 为什么用Python做游戏2. 小游戏集合及源代码(整理不易,一键三连)2.1 外星人小游戏2.2 塔防小游戏2.3 三国小游戏2.4 打飞机游戏2.5 飞机大战小游戏2.6 玛丽快跑小游戏2.7 涂鸦跳跃小游戏2.8 猜数字小游戏2.9 坦克…

金蝶云星空财务账套数据库中了.locked勒索病毒的解密步骤和预防方式

最近,金蝶云星空财务账套的数据库遭到了一次严重的勒索病毒攻击,导致数据库中重要数据被加密。这种攻击对企业来说是一种巨大的威胁,因为数据是企业的核心资产之一。而此次攻击的病毒为.locked后缀勒索病毒,而locked勒索病毒在本月…

VUE L 生命周期 ⑩①

目录 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨ V u e j s Vuejs Vuejs初见生面周期分析生命周期生命周期总结总结 文章有误请指正,如果觉得对你有用,请点三连一波,蟹蟹支持✨ ⡖⠒⠒⠒⠤⢄…

Spring 项目过程及如何使用 Spring

文章目录 1.创建 Spring 项目步骤1.1 创建 Maven 项目1.2添加 Spring 框架支持1.3 添加启动项2.如何使用 Spring2.1 存储 Bean 对象2.1.1 创建 Bean对象2.1.2 将 Bean对象注册到容器中 2.2 获取并使用 Bean对象2.2.1 使用 ApplicationContext 获取对象2.2.2 使用 BeanFactory 获…

五、Docker镜像发布到阿里云/私有库

学习参考:尚硅谷Docker实战教程、Docker官网、其他优秀博客(参考过的在文章最后列出) 目录 前言一、本地镜像发布到阿里云1.1 流程图1.2 注册阿里云创建容器服务个人实例1.3 创建命名空间1.4 创建镜像仓库1.5 将镜像推送到阿里云本地仓库 二、从阿里云仓库拉去自己推…

Matlab统计分析 -- 聚类算法模型

统计分析 – 聚类算法模型 距离分析 数据标准化 欧氏距离与量纲有关,因此,有时需要对数据进行预处理, 如标准化等。 在MATLAB中的命令是zscore,调用格式 Z zscore(X) 输入X表示N行p列的原始观测矩阵,行为个体&…

Nginx-反向代理详解

本文已收录于专栏 《中间件合集》 目录 概念说明什么是Nginx什么是反向代理 功能介绍配置过程1.修改nginx配置文件修改全局模块修改工作模块修改HTTP模块 2.保存配置文件3.重启配置文件4.查看配置文件是否重启成功 配置反向代理的好处总结提升 概念说明 什么是Nginx Nginx 是一…

你真的会写 HelloWorld 吗?

目录 Hello World 写一个批处理命令行脚本 关于include 关于程序的入口 输出充定向 在内存的存储详情 WinHex工具介绍 初学C语言时,第一个程序一定是Hello World!。但是Hello World的具体实现细节你真的了解吗? Hello World C语言代码如下&#…

SSM国内热门景点推荐系统的开发-计算机毕设 附源码83762

SSM国内热门景点推荐系统的开发 摘 要 为了方便用户快速定位自己感兴趣的国内热门旅游景点信息,国内热门景点推荐系统应运而生。本系统的前端界面主要实现页面的美观和动态效果使之符合广大群众的审美观,后台主要使用的技术主要有Java编程语言&#xff0…

Paragon NTFS2023Mac读取、写入外置移动硬盘软件

在我们日常使用电脑时常常会出现NTFS格式分区,那你知道NTFS For Mac是什么?简单的理解就是让你在mac系统下,可以正常读写Windows的Ntfs格式的分区。其中还包括Windows NT 4,2000,XP,2003,Vista&…

springboot 新农村信息化管理与服务平台-计算机毕设 附源码83372

springboot 新农村信息化管理与服务平台 目 录 摘要 1 绪论 1.1新农村信息化概念 1.2研究内容 1.3springboot框架介绍 1.4论文结构与章节安排 2 新农村信息化管理与服务平台系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析…

如何用GitKeep提交和推送一个空目录或文件夹

目录 .Gitkeep简介 .Gitkeep是什么 如何用GitKeep提交和推送一个空目录或文件夹 结论 相关参考 .Gitkeep简介 Git是一个开发工具,帮助团队管理他们的源代码并有效地处理项目。通过GitHub或其他托管服务上传时,不可能包括空白/空目录。这是有问题的…

[Arduino] ESP32开发 - 基础入门与原理分析

实用 GPIO 用到再查,熟能生巧,别上来就背图,一天你就忘了! 仅输入引脚 下面的四个引脚由于内部没有上拉下拉电阻,所以仅仅支持输入信号 GPIO 34 GPIO 35 GPIO 36 GPIO 39 SPI Flash 闪存引脚 这些引脚都是对 ESP32 内…

【Java】以数组为例简单理解引用类型变量

我们首先要知道内存是一段连续的存储空间,主要用来存储程序运行时数据的,如果对内存中存储的数据不加区分的随意存储,那对内存管理起来将会非常麻烦,就像一个杂乱的房间,你如果想在这个房间里找一个东西的话,找起来就会…

怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂)

目录 BeanFactory怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂)总结 BeanFactory 怎么使用Sprng提供的容器去注册一个Bean对象(BeanFactory工厂) 重点:Spring容器,例如Beanfactory其实并没…