git高级用法

文章目录

  • git commit规范指南
    • commit message的作用
    • Angular规范 Commit message的格式
      • header
      • body
      • footer
      • revert
    • 示例
    • Commitizen工具
      • commitizen配置
    • 参考材料
  • git高级技巧
    • git rebase
      • git cherry-pick
      • git grep
      • git stash
    • 参考材料

最近在代码开发的过程中,逐渐认识到了版本管理过程中提交记录维护的重要。一个好的项目提交记录可以方便地跟踪工程历史,不必深入看代码即可了解当前commit的作用,提高项目的整体质量,更可以提高个人的工程素质。
因此,仔细学习整理了一下开发过程中git高级用法和commit规范指南,希望能用于以后的工作开发中。本博客以学习分享为目的,不足之处还请大家多多谅解。

觉得文章有收获,欢迎关注公众号鼓励一下作者呀~
在学习的过程中,也搜集了一些量化、技术的视频及书籍资源,欢迎大家关注公众号【亚里随笔】获取
百度网盘资源

git commit规范指南

commit message应该清晰明了,说明本次提交的目的。git的提交使用git commit -m "hello world"之类的来提交 commit,但是"hello world"这样的的无意见的commit无法让别人理解本次提交的目标是为了什么。
社区有多种commit message的写法规范,Angular规范是目前使用最广泛的写法,比较合理和系统化,并且有配套的工具。

commit message的作用

• 提交更多的历史信息,方便快速浏览。例如使用git log  HEAD --pretty=format:%s,可以显示上次发布后的变动,每个commit占一行,可以快速浏览某次commit的目的。
• 可以过滤某些commit,用于快速查找信息。例如使用git log  HEAD --grep fea,可以快速查找信息
• 可直接从commit生成change log。发布新版本时,可以自动生成change log来说明与上一个版本差异。
• 其他优点
	○ 可读性好,不必深入看代码即可了解当前 commit的作用
	○ 为code review做准备
	○ 方便跟踪工程历史
	○ 提高项目的整体质量,提高个人工程素质

因此,提交commit时,遵循良好的规范是非常值得养成的习惯。

Angular规范 Commit message的格式

每次提交 ,commit message都包括三部分:header,body和footer。
形式如下,<>表示填入特定的信息:

<type>(<scope>): <subject>
// 空一行
<body>
// 空一行
<footer>
其中,Header 是必需的,Body 和 Footer 可以省略

其中,header是必需的,body和footer可以省略。但每部分,任何一行都不得超过72个字符(或100个字符),避免自动换行影响美观。

header

• header部分只有一行,包括三个字段
	○ type,必需,用于说明 commit的类别,只允许使用以下7个标识。type为feat和fix会现在change log中,其他情况可以配置。
		§ feat,新功能
		§ fix,修补bug
		§ docs,文档
		§ style,格式变化,不影响代码变动
		§ refactor,重构,不是新增功能,也不修改bug的代码变动
		§ test,增加测试
		§ chore,构建过程或辅助工具的变动
	○ scope,可选
		§ 用于说明commit影响的范围,简要说明修改会涉及的部分,如数据层、控制层、视图层
	○ subject,必需
		§ commit message,不超过50个字符
		§ 书写事项
			□ 以动词开头,使用第一人称现在时
			□ 第一个字母小写
			□ 结尾不加句号

body

• 对本次commit的详细描述,可以分成多行
• 书写事项
	○ 使用第一人称现在时
	○ 第2行是空行
	○ 应该说明代码变动的动机,以及与以前行为的对比

footer

• footer部分只用于以下两种情况
	○ 不兼容变动:如果代码与上一个版本不兼容,则footer部分以BREAKING CHANGE开头,后面是对变动的描述,以及变动理由和迁移方法
	○ 关闭issue:如果当前commit是针对某个issue,可以在footer部分关闭这个issue,可依次关闭多个issue, Closes #123, #245, #992

revert

• 当前commit是用于撤销以前的commit,必须以revert开头,后面跟着被撤销commit的header
• body部分格式固定:This reverts commit 	

在这里插入图片描述
如果当前commit与被撤销的commit在同一个release里面,那么它们不会出现在change log里面。如果两者在不同的release里,当前commit会出现在change log的reverts小标题下面。

示例

angular.js的提交示例
git高级用法_第1张图片
git高级用法_第2张图片

Commitizen工具

大量的代码提交,必然会产生大量的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。

commitizen配置

我主要关注在非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作为开发者必备技能,除了日常使用的git add, commit, push, pull, fetch, merge, checkout等基础命令,还有一些比较有用好玩的命令。

git rebase

rebase也称为变基,它是合并来自不同分支修改的另一种方法。git rebase [basebranch] [topicbranch]命令将特性分支topicbranch变基到目标分支basebranch,即将topicbranch分支上的修改在二者的公共快照上重演一遍。
合并分支最容易的方法是merge,如下图所示,它会把两个分支的最新快照C3和C4以及二者最近的共同祖先C2进行三方合并,合并的结果是生成一个新的快照,并提交 。
git高级用法_第3张图片
git高级用法_第4张图片
另一种合并的方法就是变基:提取在C4中引入的补丁和修改,然后在C3的基础上应用一次。可以使用rebase命令将提交到某一分支上的所有修改都移到另一分支上,就像重新播放一样。变基的原理是首先找到两个分支(如当前分支experiment、变基操作的目标基底分支master)的最近共同祖先C2,然后对此当前分支相对于该祖先分支的历次提交,提取相应的修改并存为临时文件,然后将当前分支指向目标基底C3,最后以此将之前另存为临时文件的修改在C3上重新应用一遍。
git高级用法_第5张图片
rebase使得提交历史更加整洁,尽管实际的开发工作是并行的,但它们看上去是串行的,提交历史是一条直线,没有分叉。
rebase的两大使用场景分别是合并分支、修改commit:

  • 合并分支:rebase过程中如果发生冲突,需要先解决冲突,add后直接 git rebase --continue,不要git commit
  • 修改commit:git rebase -i commitId,commitId可以在git log里看到,在rebase过程中可以对commit进行编辑等,按需要设置即可;在合并其他分支的过程中同样可以合并commit
    git高级用法_第6张图片

git cherry-pick

可以把某几个commit“摘“出来到一个新的分支,可以使用cherry-pick。

  • 从master拉取新的分支feature/issue
  • 确认要摘取的commitId

git grep

grep是查找检索功能,如git grep ‘Long userId’,可以查找项目中的所有’Long userId’

git stash

当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转移到其他分支上进行一些工作。但是你不想提交进行了一半的工作,否则以后你无法回到这个工作点,这些就可以使用git stash命令。
即如果你修改了本地仓库但不想提交commit,此刻需要切换到别的分支,就直接使用git stash

  • 可以使用git stash list查看本地一共有哪些stash
  • 如果想还原stash,使用git stash apply stash@{index}或者git stash pop
  • stash只对本分支有效,无法查看其它分支的stash

参考材料

- https://www.dazhuanlan.com/yzbdxiangyata/topics/1101684
- https://www.progit.cn/#_rebasing

你可能感兴趣的:(平台工具类,git,commitizen,commit,message)