觉得文章有收获,欢迎关注公众号鼓励一下作者呀~
在学习的过程中,也搜集了一些量化、技术的视频及书籍资源,欢迎大家关注公众号【亚里随笔】获取
commit message应该清晰明了,说明本次提交的目的。git的提交使用git commit -m "hello world"之类的来提交 commit,但是"hello world"这样的的无意见的commit无法让别人理解本次提交的目标是为了什么。
社区有多种commit message的写法规范,Angular规范是目前使用最广泛的写法,比较合理和系统化,并且有配套的工具。
• 提交更多的历史信息,方便快速浏览。例如使用git log HEAD --pretty=format:%s,可以显示上次发布后的变动,每个commit占一行,可以快速浏览某次commit的目的。
• 可以过滤某些commit,用于快速查找信息。例如使用git log HEAD --grep fea,可以快速查找信息
• 可直接从commit生成change log。发布新版本时,可以自动生成change log来说明与上一个版本差异。
• 其他优点
○ 可读性好,不必深入看代码即可了解当前 commit的作用
○ 为code review做准备
○ 方便跟踪工程历史
○ 提高项目的整体质量,提高个人工程素质
因此,提交commit时,遵循良好的规范是非常值得养成的习惯。
每次提交 ,commit message都包括三部分:header,body和footer。
形式如下,<>表示填入特定的信息:
<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
其中,Header 是必需的,Body 和 Footer 可以省略
其中,header是必需的,body和footer可以省略。但每部分,任何一行都不得超过72个字符(或100个字符),避免自动换行影响美观。
• header部分只有一行,包括三个字段
○ type,必需,用于说明 commit的类别,只允许使用以下7个标识。type为feat和fix会现在change log中,其他情况可以配置。
§ feat,新功能
§ fix,修补bug
§ docs,文档
§ style,格式变化,不影响代码变动
§ refactor,重构,不是新增功能,也不修改bug的代码变动
§ test,增加测试
§ chore,构建过程或辅助工具的变动
○ scope,可选
§ 用于说明commit影响的范围,简要说明修改会涉及的部分,如数据层、控制层、视图层
○ subject,必需
§ commit message,不超过50个字符
§ 书写事项
□ 以动词开头,使用第一人称现在时
□ 第一个字母小写
□ 结尾不加句号
• 对本次commit的详细描述,可以分成多行
• 书写事项
○ 使用第一人称现在时
○ 第2行是空行
○ 应该说明代码变动的动机,以及与以前行为的对比
• footer部分只用于以下两种情况
○ 不兼容变动:如果代码与上一个版本不兼容,则footer部分以BREAKING CHANGE开头,后面是对变动的描述,以及变动理由和迁移方法
○ 关闭issue:如果当前commit是针对某个issue,可以在footer部分关闭这个issue,可依次关闭多个issue, Closes #123, #245, #992
• 当前commit是用于撤销以前的commit,必须以revert开头,后面跟着被撤销commit的header
• body部分格式固定:This reverts commit
如果当前commit与被撤销的commit在同一个release里面,那么它们不会出现在change log里面。如果两者在不同的release里,当前commit会出现在change log的reverts小标题下面。
大量的代码提交,必然会产生大量的commit log,而每一次commit是阶段性的ending,应记录着这一阶段所完成的事以及关注点,尽可能详细具体。
上面介绍了Angular目前的commit规范,一般来说在写git commit 时,按规范进行填写即可。不过也有命令行工具提供了step by step的引导——commitizen。
commitizen是一个格式化commit message的工具。代码commitizen后,提交commit mesage时,不再使用git commit -m方法,而是git cz,会出现交互式选项,给你一个完善的commit message。
我主要关注在非node项目下,使用commitizen。
1. 首先安装node.js
2. 安装git-cz:npm install -g commitizen git-cz
3. 安装changelog,生成changelog的工具:
npm install -g conventional-changelog
npm install -g conventional-changelog-cli
4. 进入项目目录,执行:npm init --yes,会生成项目对应的package.json,将项目目录下产生的package.json的内容写入到自己建的package.json(/User/Elite/package.json)中,如果有多个项目,将各项目生成的package.json内容写入到package.json中,配置(/User/Elite/package.json)。我试了一下,init生成的node_modules和package.json删除,也可以运行
5. 支持angular的commit message格式:commitizen init cz-conventional-changelog --save --save-exact
6. 生成changelog:conventional-changelog -p angular -i CHANGELOG.md -s
- https://segmentfault.com/a/1190000009048911
- https://www.jianshu.com/p/36d970a2b4da
- https://www.jianshu.com/p/d264f88d13a4
git作为开发者必备技能,除了日常使用的git add, commit, push, pull, fetch, merge, checkout等基础命令,还有一些比较有用好玩的命令。
rebase也称为变基,它是合并来自不同分支修改的另一种方法。git rebase [basebranch] [topicbranch]命令将特性分支topicbranch变基到目标分支basebranch,即将topicbranch分支上的修改在二者的公共快照上重演一遍。
合并分支最容易的方法是merge,如下图所示,它会把两个分支的最新快照C3和C4以及二者最近的共同祖先C2进行三方合并,合并的结果是生成一个新的快照,并提交 。
另一种合并的方法就是变基:提取在C4中引入的补丁和修改,然后在C3的基础上应用一次。可以使用rebase命令将提交到某一分支上的所有修改都移到另一分支上,就像重新播放一样。变基的原理是首先找到两个分支(如当前分支experiment、变基操作的目标基底分支master)的最近共同祖先C2,然后对此当前分支相对于该祖先分支的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底C3,最后以此将之前另存为临时文件的修改在C3上重新应用一遍。
rebase使得提交历史更加整洁,尽管实际的开发工作是并行的,但它们看上去是串行的,提交历史是一条直线,没有分叉。
rebase的两大使用场景分别是合并分支、修改commit:
可以把某几个commit“摘“出来到一个新的分支,可以使用cherry-pick。
grep是查找检索功能,如git grep ‘Long userId’,可以查找项目中的所有’Long userId’
当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转移到其他分支上进行一些工作。但是你不想提交进行了一半的工作,否则以后你无法回到这个工作点,这些就可以使用git stash命令。
即如果你修改了本地仓库但不想提交commit,此刻需要切换到别的分支,就直接使用git stash
- https://www.dazhuanlan.com/yzbdxiangyata/topics/1101684
- https://www.progit.cn/#_rebasing