商汇粹外网资源平台

搜索
查看: 1978|回复: 5

如何写好 Git commit log?

[复制链接]

该用户从未签到

1

主题

2

帖子

27

积分

新手上路

Rank: 1

积分
27
发表于 2022-10-22 09:53:17 | 显示全部楼层 |阅读模式
目前我倾向于以下的风格,期望大家能给出更好的建议或使用经验。

主要功能描述:
* 细节1
* 细节2
* 细节3

在爆栈上也有类似的讨论,请参见
Git Commit Messages : 50/72 Formatting

基本上我很同意50/72的书写方式,当然我也更同意写得乱七八糟比什么都不写要好。好像这个问题没什么人想讨论,是因为国内用Git的人还是少吗?
回复

使用道具 举报

该用户从未签到

2

主题

15

帖子

53

积分

注册会员

Rank: 2

积分
53
发表于 2022-10-22 10:11:37 | 显示全部楼层
可以在 git commit 的时候使用 Emoji 为每次提交打上一个标签。使得每次 commit 独具一格,鹤立鸡群,在整个提交历史长流中很容易找到。说实话,这样子不仅觉得自己看起来很呆萌,更重要的是 Emoji 表情包含的丰富的语义和情绪,使得提交记录非常好理解,阅读体验非常棒,如下图。



使用 Emoji 当做标签,能非常好的对提交记录分门别类进行整理,你看
✨ Add feature 1✨ Add feature 2✨ Add feature 3
对于这类型记录,一看就知道添加了一些新 feature 进来了。
  Add colors for new gitmojis  Add boom gitmoji styles   Update emojis order, add mising colors
哎,知乎回答对 emoji 支持不是很好,好多都不能正常显示,建议到这篇文章看看完整的,https://zhuanlan.zhihu.com/p/29764863
对于这些记录,主要是样式方面的调整    。
  Update yarn.lock & package.json    Update .travis.yml
对于这些呢,是修改配置文件。
  Update flexboxgrid  Import clipboard only when needed
这些,哪个猪队友又在写 Bug 啊!
⚡️ improve performance of card hover effect
这里进行了一次性能优化,速度像闪电一样快。
那么这些 Emoji 是怎么使用?答案是,在 Emoji 的名字前后个加上一个冒号:name_of_emoji:
因此,我们可以这样提交代码
git commit -m "  fix a bug writtten by pig teammate"
他的效果是这样的:
  fix a bug written by pig teammate
但是这些 Emoji 标签不能乱用,必须统一规范,不然很容易造成误解,https://gitmoji.carloscuesta.me/ (可以点击原文链接查看)整理了一套规范。大家可以保存,以备参考。



我们不仅可以在 git commit 时,在 README.md,在 git wiki 里面都可以直接使用 Emoji,是不是很有意思。
以上,funny it!
回复

使用道具 举报

该用户从未签到

4

主题

12

帖子

40

积分

新手上路

Rank: 1

积分
40
发表于 2022-10-22 10:29:57 | 显示全部楼层
git commit -m"`curl -s http://whatthecommit.com/index.txt`"
随机生成commit message
回复

使用道具 举报

该用户从未签到

5

主题

28

帖子

90

积分

注册会员

Rank: 2

积分
90
发表于 2022-10-22 10:48:17 | 显示全部楼层
这种东西,当然要借助工具了,才能够写得即规范,又格式化,还能够支持后续分析。
目前比较建议的是,使用终端工具 commitizen/cz-cli + commitizen/cz-conventional-changelog  + conventional-changelog/standard-version 一步解决提交信息和版本发布。  
甚至,如果想更狠一点,在持续集成里面加入 marionebl/commitlint 检查 commit 信息是否符合规范,也不是不可以。
回复

使用道具 举报

该用户从未签到

2

主题

6

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2022-10-22 11:06:37 | 显示全部楼层
介绍下目前字节跳动开发中使用的 git commit log 规范,内容与下列规范基本一致。
文章来源于阮一峰老师的博客:Commit message 和 Change log 编写指南

Git 每次提交代码,都要写 Commit message(提交说明),否则就不允许提交。
$ git commit -m "hello world"
上面代码的-m参数,就是用来指定 commit mesage 的。
如果一行不够,可以只执行git commit,就会跳出文本编辑器,让你写多行。
$ git commit
基本上,你写什么都行(这里这里这里)。



但是,一般来说,commit message 应该清晰明了,说明本次提交的目的。

目前,社区有多种 Commit message 的写法规范。本文介绍Angular 规范(见上图),这是目前使用最广的写法,比较合理和系统化,并且有配套的工具。
一、Commit message 的作用

格式化的Commit message,有几个好处。
(1)提供更多的历史信息,方便快速浏览。
比如,下面的命令显示上次发布后的变动,每个commit占据一行。你只看行首,就知道某次 commit 的目的。
$ git log <last tag> HEAD --pretty=format:%s



(2)可以过滤某些commit(比如文档改动),便于快速查找信息。
比如,下面的命令仅仅显示本次发布新增加的功能。
$ git log <last release> HEAD --grep feature
(3)可以直接从commit生成Change log。
Change Log 是发布新版本时,用来说明与上一个版本差异的文档,详见后文。

二、Commit message 的格式

每次提交,Commit message 都包括三个部分:Header,Body 和 Footer。
<type>(<scope>): <subject> // 空一行 <body> // 空一行 <footer>
其中,Header 是必需的,Body 和 Footer 可以省略。
不管是哪一个部分,任何一行都不得超过72个字符(或100个字符)。这是为了避免自动换行影响美观。
2.1 Header

Header部分只有一行,包括三个字段:type(必需)、scope(可选)和subject(必需)。
(1)type
type用于说明 commit 的类别,只允许使用下面7个标识。

  • feat:新功能(feature)
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动


如果type为feat和fix,则该 commit 将肯定出现在 Change log 之中。其他情况(docs、chore、style、refactor、test)由你决定,要不要放入 Change log,建议是不要。
(2)scope
scope用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同。
(3)subject
subject是 commit 目的的简短描述,不超过50个字符。

  • 以动词开头,使用第一人称现在时,比如change,而不是changed或changes
  • 第一个字母小写
  • 结尾不加句号(.)
2.2 Body

Body 部分是对本次 commit 的详细描述,可以分成多行。下面是一个范例。
More detailed explanatory text, if necessary.  Wrap it to  about 72 characters or so.   Further paragraphs come after blank lines. - Bullet points are okay, too - Use a hanging indent
有两个注意点。
(1)使用第一人称现在时,比如使用change而不是changed或changes。
(2)应该说明代码变动的动机,以及与以前行为的对比。
2.3 Footer

Footer 部分只用于两种情况。
(1)不兼容变动
如果当前代码与上一个版本不兼容,则 Footer 部分以BREAKING CHANGE开头,后面是对变动的描述、以及变动理由和迁移方法。
BREAKING CHANGE: isolate scope bindings definition has changed.      To migrate the code follow the example below:      Before:      scope: {       myAttr: 'attribute', }      After:      scope: {       myAttr: '@', }      The removed `inject` wasn't generaly useful for directives so there should be no code using it.
(2)关闭 Issue
如果当前 commit 针对某个issue,那么可以在 Footer 部分关闭这个 issue 。
Closes #234
也可以一次关闭多个 issue 。
Closes #123, #245, #992
2.4 Revert

还有一种特殊情况,如果当前 commit 用于撤销以前的 commit,则必须以revert:开头,后面跟着被撤销 Commit 的 Header。
revert: feat(pencil): add 'graphiteWidth' option  This reverts commit 667ecc1654a317a13331b17617d973392f415f02.
Body部分的格式是固定的,必须写成This reverts commit <hash>.,其中的hash是被撤销 commit 的 SHA 标识符。
如果当前 commit 与被撤销的 commit,在同一个发布(release)里面,那么它们都不会出现在 Change log 里面。如果两者在不同的发布,那么当前 commit,会出现在 Change log 的Reverts小标题下面。
加餐环节

有不少应届同学私信我问一下,如何学习 git,git 应该掌握那些命令以及 git 要学习到什么程度。
其实掌握常用的 git 命令和操作就可以了,对于一些不常用的命令可以在用到时再查。
这里给大家推荐几本当初学习 git 的优质书籍吧:
链接: https://pan.baidu.com/s/1fBJWnNwKYwId_fNx6nBIug 提取码: 1e51


  • 《Pro Git 中文版》
这本书比较权威,内容介绍的比较系统,可以作为学习 git 的首选材料。

  • 《完全学会GIT GITHUB GIT SERVER》
这本书写的比较有趣味性,比较适合对 git 一无所知的小白,或者其他没有开发经验的同学。
另外,国人也写了一本 git 指南《Git权威指南》。
福利

分享下电驴(eMule)的源码
分享一款 ftp 软件 —— filezilla的源码
金山卫士开源代码
自己写了一个LOL游戏......
回复

使用道具 举报

该用户从未签到

2

主题

11

帖子

33

积分

新手上路

Rank: 1

积分
33
发表于 2022-10-22 11:24:57 | 显示全部楼层
我看过的比较合理的是 thoughtbot 的规范:
dotfiles/gitmessage at master · thoughtbot/dotfiles · GitHub
# 50-character subject line## 72-character wrapped longer description. This should answer:## * Why was this change necessary?# * How does it address the problem?# * Are there any side effects?## Include a link to the ticket, if any.
他们有写一篇文章解释:
5 Useful Tips For A Better Commit Message
另外,大家可以看看 Linux 的 Commit Message 是怎么写的, 基本上都是长篇大论的:
Commits · torvalds/linux · GitHubLinus 也讨论过此事:
https://github.com/torvalds/linux/pull/17#issuecomment-5659933

最后补上 Ruby-China 一篇总结的非常好的文章:
Ruby China | 写出好的 commit message
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表