共计 3035 个字符,预计需要花费 8 分钟才能阅读完成。
Git 是最风行的代码版本控制系统,这一系列文章介绍了一些 Git 的高阶应用形式,从而帮忙咱们能够更好的利用 Git 的能力。本系列一共 8 篇文章,这是第一篇。原文:Creating the Perfect Commit in Git[1]
Git 中的提交能够是以下两种状况之一:
- 能够是出于多种目标所作的各种各样的更改: 用于修复 bug 的几行代码,尝试重写旧模块,或者实现全新性能的几个新文件。
- 或者,如果略微小心一点,就能够帮忙咱们放弃对事件的掌控。能够将提交作为一个仅寄存特定类型相干更改的容器,从而使咱们更容易了解产生了什么。
本文将探讨如何构建后一种类型的提交,或者换句话说:“完满的”提交。
Git 进阶系列:
- 创立完满的提交(本文)
- Git 中的分支策略
- 基于 Pull Request 实现更好的合作
- 合并抵触
- Rebase vs Merge
- 交互式 Rebase
- Git 中的 Cherry-pick 提交
- 用 Reflog 复原失落的提交
为什么整洁、细粒度的提交很重要
真有必要以审慎、三思而行的形式撰写提交吗?就不能只是把 Git 当作一个无聊的备份零碎吗?咱们再来回顾一下下面的例子。
如果咱们只是遵循第一种抉择(只有批改产生,就塞进提交里去),提交就会失去很多价值。提交和提交之间的分隔变得很随便,仿佛没有理由将更改放入某一个提交而不是另一个提交中。之后再看这些提交,比方当你的共事试图搞清楚批改了什么,就像在家里翻箱倒柜找货色一样,很难找到想要的货色。
如果咱们遵循第二种形式,只在提交中放入相干的内容中,须要制订更多的打算和规定。但最终咱们会失去十分有价值的处分: 洁净的提交历史!这些提交能够帮忙咱们了解产生了什么,有助于以可了解的形式解释简单的变动。
那怎样才能创立更好的提交呢?
创作更好的提交
在 Git 中创立更好的提交须要了解一个外围概念: 暂存区(Staging Area)。
暂存区正是为了这个目标而创立的,从而容许开发人员以十分细粒度的形式抉择应该作为下一次提交的局部更改。而且,与其余版本控制系统不同,Git 强制应用暂存区。
然而可怜的是,暂存区依然很容易被疏忽,一次简略的 git add .
将承受以后所有本地更改,并标记为下一次提交。
确实,有时这是十分有用和无效的办法。但很多时候,咱们最好停一下,看一下所有更改是否真的是对于同一个主题,兴许抉择两次或三次独立提交可能是更好的抉择。
大多数状况下,放弃较小的提交比放弃较大的提交更有意义。专一于独自的主题(而不是两个、三个或四个),往往使提交更容易浏览。
暂存区容许咱们认真筛选每一个应该进入下次提交的更改:
$ git add file1.ext file2.ext
这会只将这两个文件标记为下一次提交,而将其余更改留给未来提交或进一步编辑。
简略停一下,无意识的抉择什么应该放到下一次提交,对咱们有很大的帮忙。但还能够做得更准确一些,因为有时候即便是单个文件中的更改也属于多个主题。
来看一个实在的例子,能够应用“git diff”命令或者像 Tower[2]一样的 git 桌面 GUI 来查看“index.html”文件中的具体变更:
当初,咱们尝试增加给 git add
增加 -p
选项:
$ git add -p index.html
该命令批示 Git 对文件进行“补丁”级别的查看: Git 会帮忙咱们查看文件中的所有更改,而后问咱们,对于每个块,是否要增加到暂存区:
咱们为第一个块键入 Y(示意“是”),为第二个块键入 N(示意“否”),能够在下次提交时将该文件的第一局部更改蕴含进来,但将其余更改留到当前或进行更多的编辑。
测试代码
既然咱们议论的是“完满的提交”,就不能漠视测试这个话题。如何精确“测试”代码当然有不同形式,然而“测试很重要”这一概念曾经是陈词滥调了。事实上,如果一段代码没有通过适当的测试,许多团队回绝认为变更曾经实现。
还在犹豫是否应该测试本人的代码?让咱们廓清一些对于测试的误区:
- “测试被高估了”: 事实上,测试能够帮忙咱们更快找到 bug。最重要的是,帮忙咱们在产品投入生产之前找到它们,从而防止误造成最大的挫伤。毫不夸大的说,尽早发现破绽是无价的!
- “测试破费了贵重的工夫”: 一段时间之后,你会发现编写良好的测试使你编码的速度更快了。测试缩小了 debug 的工夫,构造良好的测试也为理论实现做好了筹备。
- “测试是简单的”: 兴许几年前会有这方面的争执,但当初曾经不一样了,大多数业余编程框架和语言都对配置、编写和治理测试提供了宽泛的反对。
总而言之,将测试作为开发的一部分简直能够保障可能使咱们代码库更加强壮,同时可能帮忙咱们成为更好的开发者。
有价值的提交信息
应用 Git 进行版本控制并不是一种备份代码的非凡形式。况且,正如咱们曾经探讨过的,提交并不是任意更改的转储。提交的存在能够帮忙咱们及团队成员了解我的项目中产生了什么,好的提交信息能够更好的确保这一点。
但什么是好的提交信息呢?
- 有一个简明扼要的主题行 (subject line) 总结变更
- 有一个描述性的主体(message body),尽可能简洁的解释了最重要的事实
让咱们从主题行开始,指标是取得所产生事件的简要总结。当然,简洁是一个绝对概念,个别的教训法令是 (现实状况下) 将主题管制在 50 个字符以内。顺便说一下,如果你发现自己很难想出简短的内容,可能表明提交囊括了太多主题!可能值得再去看一看,是否能够把它分成多个独自的提交。
如果用一个换行符和一个额定的空行完结主题,Git 就会晓得上面的文本是音讯的“主体”。在这里,有更多空间来形容产生了什么。注释应该旨在答复这些问题:
- 提交之后,我的项目产生了什么变动?
- 做出这种扭转的起因是什么?
- 有什么特地须要留神的吗? 对于这些变动还有什么其他人应该晓得的吗?
如果在编写提交音讯体时牢记这些问题,就很可能对所产生的事件给出有用的形容,最终会使团队成员 (一段时间后也会使咱们本人) 在试图了解这一提交时受害。
在下面对于提交音讯内容的规定之外,许多团队还关怀格局: 在字符限度、软或硬换行等方面达成统一,这些都有助于在团队中产生更好的提交。
为了更容易恪守这些规定,咱们最近在 Git 桌面 GUI Tower 中增加了一些性能: 例如,能够依据本人的爱好配置字符数或主动换行。
优良的代码库蕴含大量优良的提交
任何开发人员都想要让本人的代码库越来越好,但只有一种办法能够实现这个崇高目标: 一直做出优良的提交!心愿我可能证实 (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
本文由 mdnice 多平台公布