Git系列之git tag

勤奋不是嘴上说说而已,而是实际的行动,在勤奋的苦度中持之以恒,永不退却。业精于勤,荒于嬉;行成于思,毁于随。在人生的仕途上,我们毫不迟疑地选择勤奋,她是几乎于世界上一切成就的催产婆。只要我们拥着勤奋去思考,拥着勤奋的手去耕耘,用抱勤奋的心去对待工作,浪迹红尘而坚韧不拔,那么,我们的生命就会绽放火花,让人生的时光更加的闪亮而精彩。

导读:本篇文章讲解 Git系列之git tag,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

概述

Git可给仓库历史中的某一个提交打上标签,常用于标记发布结点。

本文使用的Git版本为:

$ git --version
git version 2.23.0.windows.1

实战

列出标签

列出全部标签的命令为:git taggit tag -lgit tag -list,即-l-list选项是可选的,git tag,即默认列出全部标签,以字母顺序排序。

查找某些特定标签的命令:git tag -l "release*",查找特定标签时,-l-list选项必须要带上。

查看标签

使用git show命令可输出标签信息和与之对应的提交信息。根据标签的不同类型,其打印输出的信息不一致,参考下面章节。

创建标签

Git支持两种标签:

  • 轻量标签:lightweight,像一个不会改变的分支——它只是某个特定提交的引用。
  • 附注标签:annotated,是存储在Git数据库中的一个完整对象,可以被校验,其中包含打标签者的名字、电子邮件地址、日期时间、标签信息,并且可使用 GNU Privacy Guard (GPG)签名并验证。

通常会建议创建附注标签,这样你可以拥有以上所有信息。但是如果你只是想用一个临时标签,或因某些原因不想要保存这些信息,则使用轻量标签。

轻量标签

轻量标签,本质上是将提交校验和存储到一个文件中——没有保存任何其他信息。命令:git tag <tag_name>,即基于当前分支的最后一次提交记录打一个标签轻量。

对轻量标签执行git show命令,输出如下:

$ git tag my-tag
$ git show my-tag
commit f937f5d2d1ad11b0f6c8655f7d4380bbabc4799d (HEAD -> release_20221208_V1.4, tag: my-tag, origin/release_20221208_V1.4)
Author: johnny <johnny@aaaa.com>
Date:   Tue Dec 13 11:05:49 2022 +0800

    WTF???

diff --git a/cloud-autojob/src/test/java/com/xy/cloud/autojob/business/xxljob/AutoJobWarnHandlerTest.java b/cloud-autojob/src/test/java/com/xy/cloud/autojob/business/xxljob/AutoJobWarnHandlerTest.java

不打印额外的标签信息,打印出提交信息,和git diff信息。

附注标签

命令git tag -a <tag_name> -m "test annotated tag"创建附注标签,-a选项指定是附注标签,-m选项指定一条将会存储在标签中的信息。类似于git commit时必填的commit信息。如果没有指定-m选项,Git会启动vi编辑器要求你输入信息。

对附注标签执行git show命令,输出如下:

$ git show tag_master_release_20221011_fix_qiwei
tag tag_master_release_20221011_fix_qiwei
Tagger: scm <scm@ai.com>
Date:   Mon Oct 17 15:14:45 2022 +0800

qiwei
commit 23e88c880860f98767d80571f9b49b8c53a9cc0d (tag: tag_master_release_20221011_fix_qiwei)
Merge: b2fe24a8 1e33e55e
Author: scm <scm@ai.com>
Date:   Mon Oct 17 15:14:42 2022 +0800

    Merge branch 'release_20221011_fix_qiwei' into 'master'

    qiwei

    See merge request !72

输出打标签者的信息、打标签的日期时间、附注信息、具体的提交信息。

后期打标签

还可以对过去的提交打标签,即基于某个commit打标签:
$ git tag -a test-commit-tag f367a00 -m "test commit tag"

推送标签

git push命令默认并不会push标签到远程仓库服务器上。在创建完标签后必须显式地推送标签到服务器上。和git push origin <branch>类似。使用命令git push origin <tagname>推送,如果想把本地的多个标签推送到服务器,则可使用--tags选项指定哪些标签。

删除标签

删除本地仓库上的标签,使用命令git tag -d <tagname>,不会删除远程服务器上面的相应标签。删除远程标签有2种方式:

  1. git push <remote> :refs/tags/<tagname><remote>一般就是origin,当然支持重命名。即使用命令:git push origin :refs/tags/test-commit-tag,将冒号前面的空值推送到远程标签名,从而高效地删除它;
  2. git push origin --delete <tagname>,直观易懂。

检出标签

使用git checkout命令,查看某个标签所指向的文件版本,这个命令会使本地仓库处于detached HEAD状态。在此状态下,如果你做了某些更改然后提交它们,标签不会发生变化,但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支:

git checkout -b fix_qiwei_again tag_master_release_20221011_fix_qiwei
Switched to a new branch 'fix_qiwei_again'

如果在这之后又进行一次提交,fix_qiwei_again分支就会因为这个改动向前移动,此时它就会和tag_master_release_20221011_fix_qiwei标签产生差别。

CI Tags

基于GitLab的CI机制,每次发布都需要打一个Tag,日积月累,会发现一个Git Repository动辄几百个Tag。
在这里插入图片描述
不过,Tag数量多并不影响git clone/push/pull速度还行。实际上,影响前面几个操作的速度在于git repo里面是否有大文件。

不过:

  1. 一年,甚至两三年前的Tag用处不大
  2. 打开GitLab,页面显得不清爽
  3. Rancher/Jenkins发布时,备选项太多,不易过滤

那怎么删除历史Tag?

查询所有Tag:git tag -l
过滤指定字母开头的Tag:git tag -l | grep stggit tag -l "stg2020*"
删除远程Tag:git push -d origin $(git tag -l "stg2020*")

参考

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/142096.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!