掌握Git标签:高效管理你的版本和里程碑
一、什么是Git标签?
在 Git 中,标签(Tag)是用来给特定的提交(commit)打一个简单的标记,通常用于标识版本发布。标签的功能类似于分支,不过标签是不可移动的固定指针,通常用于标识某个版本的快照。
Git 中有两种类型的标签:
-
轻量标签(Lightweight Tag):这种标签就是一个指向特定提交的引用,没有附加的元数据,例如创建者、时间和信息。它类似于一个分支,但是不会随着新的提交而移动。
-
附注标签(Annotated Tag):这种标签是一个完整的对象,在标签中包含了作者信息、日期、标签信息等,适合正式发布的版本。
Git 标签与分支的区别:
-
分支:用于开发新特性、修复问题等。它是一个独立的开发线,允许你在不影响主线(通常是
main
或master
)的情况下进行开发。而 标签是用于给特定的提交打上标记,通常是在发布版本时;标签是对某个特定提交的引用,常用于版本控制和发布历史的标识。 -
分支是可变的,可以随时向前移动、合并或删除;它们会随着新的提交而更新。标签是不可变的,一旦创建,标签所指向的提交不会改变;标签通常用于固定某个版本或状态。
-
分支通常用于活跃的开发过程中,可以随时切换、合并、删除等。 标签用于标识特定的版本,通常在发布的时候创建,一般不会在其后进行修改。
-
分支在 Git 内部是一个可变的指针,指向最新的提交。 标签在 Git 内部也是一个指针,但它通常是指向特定的提交,表示一个固定的版本。
使用 Git 标签的场景主要包括:
-
版本发布:当准备发布一个新版本的代码时,通常会创建一个标签。这样可以快速定位到特定版本的代码。
-
里程碑标记:在项目开发的过程中,可以使用标签来标记重要的里程碑,比如完成某个功能或修复重要的bug。
-
回滚:如果某个版本的代码出现了问题,可以通过标签快速找到并回滚到之前的稳定版本。
-
发布管理:在持续集成和持续部署的流程中,标签可以帮助自动化工具识别应当发布的版本。
二、创建标签
当我们发布一个重要的版本的时候,可以使用git tag
去创建一些标签,标识版本的对应的代码。tag
分两种:一种是轻量级的,一种是含注解的标签。
轻量标签是一个直接指向某个具体提交的引用,与分支类似。它不会存储发布信息、创建者信息或时间戳等附加信息。 特点:
-
简单性:轻量标签非常简单,实际上就是一个指向某个提交的指针,不包含其他信息。
-
速度:因为只需存储一个提交指针,它的创建和访问都很快。
-
不带附加信息:轻量标签没有与其关联的元数据,例如创建者、日期或注释。
-
易于创建:使用命令
git tag <tagname>
可以轻松创建轻量标签。 -
不适合发布版本:由于轻量标签缺少完整的上下文信息,不太适合用于正式的版本发布管理,这通常需要使用“注解标签”。
创建示例:
# 创建一个名为 v1.0 的轻量标签,指向当前所在的提交。
git tag v1.0
附注标签 是指带有额外信息的标签,它不仅仅是指向某个提交的指针,还包含作者、日期和可选的消息。特点:
-
包含元数据:附注标签包含标签的创建者信息(包括姓名和电子邮件),标签创建的日期,以及附加的标签信息(消息)。
-
可签名:附注标签可以通过 GPG 签名,增加安全性和可信度,这在发布版本时尤其有用。
-
持久性:附注标签被存储在 Git 的数据库中,更加持久和可靠,而轻量标签只是一个简单的引用。
-
适合版本发布:通常用于标记软件的发布版本,附注标签可以清晰地记录版本的发布信息。
-
可以被查看:使用
git show <tag>
命令可以查看附注标签的详细信息,包括指向的提交和附注消息。
创建附注标签:
git tag -a <tagname> -m "your message"
例子:
git tag -a v1.0 -m "Release version 1.0"
整体示例:
git tag v0.10.15
git tag v0.10.13 612931c0f
git tag –a v0.10.9 –m "bumped version to 0.10.9" 89de7802
三、签署标签
创建了标签,可是如何防止对标签进行权限管理呢?防止没有权限的开发人员篡改标签的所对应的代码。
为什么说安全的?以Google所开发的repo
为例,repo
即采用GPG验证的方式,每个里程碑tag
都带有GPG加密验证,假如在里程碑v1.12.3
处想要做修改,修改完后将这个tag
删除,然后又创建同名tag
指向修改点,这必然是可以的。但是,在再次clone
修改后的项目时,会发现,对此里程碑tag
的改变不被认可,验证失败,导致你的修改在这里无法正常实现。这就是GPG验证的作用,这样就能够保证项目作者(私钥持有者)所制定的里程碑别人将无法修改。那么,就可以说,作者的代码是安全传播的。
为什么会有这种需求?一个项目从开发到发布,再到后期的更新迭代,一定会存在若干的稳定版本与开发版本(存在不稳定因素)。作为项目发起者、持有者,有权定义他(们)所认可的稳定版本,这个稳定版本,将不允许其他开发者进行改动。还以Google的repo
项目为例,项目所有者定义项目开发过程中的点A为稳定版v1.12.3
,那么用户在下载v1.12.3
版本后,使用的肯定是A点所生成的项目、产品,就算其他开发者能够在本地对v1.12.3
进行重新指定,指定到他们修改后的B点,但是最终修改后的版本给用户用的时候,会出现GPG签名验证不通过的问题,也就是说这样的修改是不生效的。
可能还是不太好理解,以坑作为示例,repo
在某个版本有个小错误,我在这个版本修复错误后,提交到内网的服务器给同事用(我重新定义这个版本的指向),最后发现同事在更新项目后,出现版本GPG签名验证错误,不能正常使用。
如何安装gnupg
?
- ubuntu安装
gnupg
:sudo apt install gnupg
。 - Centos安装
gnupg
:yum install gnupg
。
使用gnupg
:
gpg --gen-key # 生成秘钥
gpg --list-keys # 查看秘钥
关于秘钥更多操作可以参考:https://www.ruanyifeng.com/blog/2013/07/gpg.html
创建带GPG签名的git tag:
Git tag -s v0.10.9 –u "Lion Long" –m "bumped version v0.10.9" 89de7802
四、操作和管理标签
创建完一个tag
后,可以使用git show tag_name
去查看tag
的内容:
git tag # 列举所有的tag
git show v0.10.13 # 查看v0.10.13的内容
推送标签到远程服务器:
git push origin tag_name # 推送tag到远程服务器
git push origin --tags # 推送所有的tag到远程服务器
检出tag
的代码:
git checkout tag_name # 检出tag的代码
删除标签:
# 语法
git push --delete <remote-name> <tag-name>
# 删除本地tag
git tag –d tag_name
# 删除远程tag
git push origin :refs/tags/tag_name
五、总结
Git 标签是软件开发中一个非常重要的工具,它们用于标记特定的版本或重要的提交,使得版本管理更加高效和便捷。
在项目中有效地使用 Git 标签,不仅可以提升团队的工作效率,还能在发布管理、版本控制等多个方面提供便利。建议大家在每次发布前创建标签,以保证项目的每一个重要状态都有记录,并随时保持对历史版本的访问能力。