我们可以针对某一次的提交打上一个标签,有点类似于给某次提交取个别名,比如 1.0 版本发布时打个标签叫 v1.0,2.0 版本发布时打个标签叫 v2.0 ,因为每次版本提交的结果都是一连串的哈希码,不容易记忆,打上 v1.0,v2.0 这些具有某种含义的标签后,可以方便我们进行版本管理。
本文是 Git 系列的第七篇,了解前面的文章有助于更好的理解本文:
1.Git 概述
2.Git 基本操作
3.Git 中的各种后悔药
4.Git 分支管理
5.Git 关联远程仓库
6.Git 工作区储藏兼谈分支管理中的一个小问题
轻量级标签
轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。
首先我们可以通过如下命令来查看当前仓库中的所有标签:
1 | $ git tag |
打标签的方式很简单,直接通过 git tag <tagname>
来完成即可,如下命令:
1 | $ git tag v1 |
表示创建了一个名为 v1 的 tag ,这个 tag 默认是创建在最新一次的 commit 上的,如下:
我们可以利用 git show <tagname>
来查看标签对应的版本信息,如下:
我们可以通过 $ git tag -d <tagname>
命令删除一个标签:
1 | $ git tag -d v1 |
如下图:
如果我想给历史上的某次 commit 打一个标签呢?我们可以通过如下命令 git tag <tagname> <commitversion>
,如下:
1 | $ git tag v0.0 7d519 |
表示给 commit 的哈希码为 7d519 的那一次 commit 打上一个标签,如下图:
含附注的标签
而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。
打一个含附注的标签很简单,使用 git tag -a <tagname> -m <msg>
命令,如下:
1 | $ git tag -a v0.0 -m "文件初次建立" 7d519 |
如下:
如果不加最后的版本号参数,表示给最新的一次 commit 打标签。
签署标签
说到签署标签我们得先介绍一下 GPG :
GPG 是加密软件,可以使用 GPG 生成的公钥在网上安全的传播你的文件、代码。为什么说安全的?以 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 签名验证不通过的问题,也就是说这样的修改是不生效的。
—-摘自<带 GPG 签名的 Git tag>一文
使用签署标签我们先要生成 GPG Key,生成命令如下:
1 | $ gpg --gen-key |
能默认的就直接按回车默认,不能默认的就根据提示输入相应的值,这里的都很简单,不再赘述。完了之后,就可以通过如下命令来打标签了:
1 | $ git tag -s v0.0 -u "laowang" -m "文件初次建立" 7d519 |
就把上面的-a换成-s,然后添加-u参数,-u参数的值是我们在生成 GPG Key 的时候配置的 name 属性的值,注意-u参数不可以写错,否则标签会创建失败,如下:
如上图,-u 参数写错时,标签创建失败。
标签推送到远程仓库
git push 命令并不会把tag提交到远程仓库中去,需要我们手动提交,如下:
1 | $ git push origin v0.0 |
表示将 v0.0 标签提交到远程仓库,也可以通过 $ git push origin --tags
提交所有的 tag 到远程仓库,如下:
此时别人调用 git pull 更新代码之后,就能看到我们的 tag。如下:
Ok,Git 标签管理我们先说这么多。有问题欢迎留言讨论。
参考资料:
- 《GitHub入门与实践》
- 《Pro Git》