GitHub学习记录7

Git提交规范

在团队开发中,提交要遵循相应的规范。

一个commit包含如下几个信息:

  • commit message - 提交的内容相关描述
  • author & committer - 作者及提交者
  • changed files - 修改的文件
  • hash & parent - 提交内容的hash及在提交树上的位置

Commit Message

提交消息描述的是当前提交的功能相关信息,一般可以包括header,body,footer,

1
2
3
4
5
<header>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

其中header是必须的。Angular官方建议的格式如下:

1
2
3
4
5
6
7
<type>(<scope>): <short summary>
│ │ │
│ │ └─⫸ Summary in present tense. Not capitalized. No period at the end.
│ │
│ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core...
│
└─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|test

<header>中,<type>与<summary>是必须的,<scope>可以选填。建议<header>需要保持在50个字符之内。

  1. <type>表明本次提交的类型,一般有如下几种:
    • build: 涉及构建相关的改动
    • ci: 持续集成相关的改动
    • docs: 文档
    • feat: 新功能
    • fix: bug修复
    • perf: 性能相关改动
    • refactor: 重构相关(非bug、非新功能)
    • test: 测试相关,包括新增测试或者更改已有测试
  2. <scope>表示改动影响的范围。在Angular中,某个提交可能涉及的范围有表单处理、动画处理等。 在实际工作中可以视项目而定。
  3. <summary>则是对本次提交的简要描述,使用祈使句、现在时。如使用change而不是changed或 changes。
  4. <body>是提交信息的更为详细的描述,与<header>一样也是用祈使句、现在时。<body>描述本次 修改的动机,比如为什么引入本次改动,之前的逻辑是什么,现在的逻辑是什么,本次改动有哪些影响,等等。
  5. 最后,<footer>是可选项,一般涉及破坏性改动、功能的弃用等说明,以及对GitHub issue或 Jira ticket的引用,PR的引用等。

自动化校验commit message

有了提交信息的规范,如何确保开发者对规范进行遵守呢?我们可以使用Git提供的Git Hooks功能对提交 的信息进行校验。

在新初始化的git项目内,我们可以在.git/hooks文件夹中找到官方提供的样例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
ls -l .git/hooks
total 120
-rwxr-xr-x 1 tomo staff 478B Nov 11 20:44 applypatch-msg.sample
-rwxr-xr-x 1 tomo staff 896B Nov 11 20:44 commit-msg.sample
-rwxr-xr-x 1 tomo staff 4.5K Nov 11 20:44 fsmonitor-watchman.sample
-rwxr-xr-x 1 tomo staff 189B Nov 11 20:44 post-update.sample
-rwxr-xr-x 1 tomo staff 424B Nov 11 20:44 pre-applypatch.sample
-rwxr-xr-x 1 tomo staff 1.6K Nov 11 20:44 pre-commit.sample
-rwxr-xr-x 1 tomo staff 416B Nov 11 20:44 pre-merge-commit.sample
-rwxr-xr-x 1 tomo staff 1.3K Nov 11 20:44 pre-push.sample
-rwxr-xr-x 1 tomo staff 4.8K Nov 11 20:44 pre-rebase.sample
-rwxr-xr-x 1 tomo staff 544B Nov 11 20:44 pre-receive.sample
-rwxr-xr-x 1 tomo staff 1.5K Nov 11 20:44 prepare-commit-msg.sample
-rwxr-xr-x 1 tomo staff 2.7K Nov 11 20:44 push-to-checkout.sample
-rwxr-xr-x 1 tomo staff 3.6K Nov 11 20:44 update.sample

涉及提交相关的是下面四个:

  • pre-commit - 在Git生成commit对象前执行
  • prepare-commit-msg 在pre-commit后执行,用以生成默认的提交信息,脚本接收三个参数:
    1. 包含提交信息的临时文件名
    2. 提交的类型,如message, template, merge, squash
    3. 相关提交的SHA1,仅在有-c, -C或--amend参数时提供该参数
  • commit-msg - 在开发者编写提交信息后执行,仅有临时文件名一个参数
  • post-commit - 在commit-msg后立马执行,更多做通知用

Author & Committer

Git中,Author表示原始纂写该提交的作者,Committer表示应用该提交的人,如合并Pull Request 的项目管理员。如果是个人开发者或只使用单个Git平台服务(如GitHub、BitBucket等),我们一般 不需要对作者进行特别的配置。但如果使用多个Git平台或者有公司内部要求,我们可能需要针对不同的仓库 设置不同的用户及邮箱,比如全局可以设置个人的GitHub账号,企业内部仓库设置企业邮箱等。

1
2
3
4
5
6
# 全局默认配置
git config --global user.email "<github email>"
git config --global user.name "<github username>"
# 企业内部仓库
git config user.email "<enterprise email>"
git config user.name "<real name>"