0%

git 打tag的技巧

工作涉及多个项目,项目发版的时候需要打tag,比如上一个测试的tag是v2.0.1-sit,那么下一个tag就是v2.0.2-sit。但很多时候并不知道上一个tag是什么,就需要先git log --oneline看下最后的tag,然后复制下来在打tag的时候用,步骤:

  1. git log --oneline
  2. 找到tag,然后复制
  3. 按q退出log视图
  4. 开始打tag

能不能优化下步骤,提升下生产力?

我们是有输出tag的命令:git tags,但是这个命令会输出历史所有的tag,而且顺序是从历史到现在的,tag有很多的时候根本看不过来。

偶然得知,有一个rev-list命令可以反向时间顺序列出提交对象。这个功能很强大,这里我们只需要--tags的参数:

1
git rev-list --tags

这样会倒序显示tag的hash,但是如果tag很多的时候,这个列表会输出很多的对象,我们可以加上--max-count参数来限制条数:

1
git rev-list --tag --max-count=1

这样我们会得到最新打的tag。。。。的hash,确定吗?

我们可以验证下这个hash是不是我们最后一个的tag的hash:

1
git show 60938cced5db3a35ba6e773314ded6e5efaf28c8

Ok, 可以确认是我们想要的。

但是仅仅这样不行啊,我们获得这个hash有什么用?难道还需要专门去show一下???

我们需要加点料,可以使用git describe命令。

describe命令可以查找从提交开始可以访问的最新的标记。换句话说,它会从当前节点往后查找,找到第一个tag位置,如果当前节点的对象为tag,那么结果就显示tag的名字,否则返回tag名字以及tag之上的提交数量,以及当前提交的缩写hash后缀。

比如,我们有一个branch,上面有5个提交,两个tag:

1
2
3
4
5
6
7
8
9
10
11
12
            +--------+          +---------+
| tag1 | | tag2 |
+--------+ +---------+
hash2 hash4 hash5
+ + +
| | |
v v v
-----+----------+----------+---------+------------>
^ ^ ^
| | |
+ + +
hash1 hash3 now

假如直接运行git describe --tags,它会从现在往前去找第一个tag,输出:tag2-1-hash5

那么我们假如希望直接找到tag2呢?可以将tag2的hash传给命令:

1
git describe --tags hash4

这样可以直接输出tag2

到这里是不是有点眉目了?你品,你细品。

组合前面的describerev-list命令,我们可以直接让它输出最近的一个tag:

1
git describe --tags `git rev-list --tags --max-count=1`

OK,现在我们可以找到最近的tag了。

但是,有个问题,这个查找和分支没关系,所以我们查找的可能是sit测试的tag,可以是prod的上线tag,那我们如何区别?

我们可以使用--grep 参数:

1
git describe --tags `git rev-list --tags --grep prod --max-count=1`

这样我们可以找出prod生产tag的最后一条tag了。

但是,作为一个处女座,我还有个问题,我们总不是每次都打这么长的一串命令的吧?这不合理。

嗯,我们可以加入git的配置里面,编辑.gitconfig文件,在alias下面添加:

1
2
sit-last-tag = ! git describe --tags `git rev-list --tags --grep prod --max-count=1`
prod-last-tag = ! git describe --tags `git rev-list --tags --grep sit --max-count=1`

这样,我们只需要运行:

1
git sit-last-tag

即可获得sit测试的最后一个tag(输入git sit然后直接按tab还会自动完成哦)。


然后打tag的步骤:

  1. git sit-last-tag, 然后复制tag
  2. 打tag。

4步 变 2步,指数级优化啊有没有!

嗯,满意~😊