@[TOC]
一、引言
在上一篇文章Git 系列 3:日志查看中的【2.2.3 指定标签之前】提到了标签( tag )的知识。那么今天,我们就来聊一聊标签。
在Git 中,标签与分支类似,都是指向某一个commit 提交的引用或指针。不同的是,分支可以移动,而标签不能移动。
Git 有commit,为什么还要引入tag ?
试想这么一个场景:
“请把上周一的那个版本打包发布,commit 号是6a5819e...”
“一串乱七八糟的数字不好找!”
如果换一个办法:
“请把上周一的那个版本打包发布,版本号是v1.2”
“好的,按照tag v1.2查找commit 就行!”
所以,tag 就是一个让人容易记住的有意义的名字,它跟某个commit 绑在一起。
或者,换一种说法,
你可以将commit 上的标签认为是该commit 的别名,与commit 的sha-1 值一样唯一的标识了一个commit 提交。
二、标签的分类
2.1 轻量级标签
通过git tag tagName commit 命令可以为指定commit 提交打上标签。
例如,我想给d24e0f 提交打上标签tagA ,只需要输入以下命令
git tag tagA d24e0f
运行结果如下:
可以看到,在d24e0f 提交后面多了( tag:tagA ) 的字样,这表明,本次命令是成功的,我们已经给d24e0f 提交打上了名为tagA 的标签。
如果在标签名后不追加commit 对象的话,那么将会在最新的commit 提交上打上标签。
git tag tagB
运行结果如下:
可以看到,最新的commit 提交后面已经有了 tag:tagB 的字样,这说明,此次命令是作用在这最新的commit 提交上的。
2.2 有附注标签(annotated tag)
如果在git tag 命令中指定了 "-a","-s" 或是 "-u " 中的某一个命令参数,那么就会创建
一个有附注的标签,并且需要一个标签消息( tag message )。
如果没有 "-m " 或是 "-F " 这些参数,那么就会启动一个编辑器来让用户输入标签消息。
例如,我想在cf73e8 提交上打上一个信息为“ annotated ” 的标签tagC ,只需要输入以下命令:
git tag -a tagC -m "annotated" cf73e8
运行结果如下:
可以看到,我们已经成功的在cf73e8 提交打上了标签tagC 。
2.3 两种标签的比较
同:
- 两种类型的标签都是引用。
异:
- 轻量级标签直接指向某个commit 提交;有附注标签是指向一个tag 对象,然后这个tag 对象再指向某个commit 提交。
- 两者蕴含的信息量不同,有附注标签将提供更多的信息,比如谁打的标签,什么时候打的标签等。
有关对象的知识将在以后进行介绍,敬请期待。
接下来,我们来进行验证。
通过git show tagName 命令可以查看具体标签的信息。
我们需要对比轻量级标签tagA 和有附注标签tagC 的信息:
git show tagA
git show tagC
运行结果如下:
可以看到,有附注标签tagC 的信息含量较多,而这正好验证了前面的说法。
三、标签的用法
3.1 打标签
通过git tag tagName 命令可以对commit 提交打上标签。具体用法,在【2.1】和【2.2】中已经提及了,这里不再重复,只做以下简单的总结:
- 对最新的commit 提交打轻量级标签
git tag tagName
- 对指定commit 提交打轻量级标签
git tag tagName commit
- 对commit 提交打有附注标签
git tag -a tagName -m "tagMessage" commit
3.2 查看标签信息
3.2.1 查看指定标签信息
通过git show tagName 命令可以查看指定标签的具体信息。具体用法在【2.3】中有提及,这里不再重复。
git show tagName
3.2.2 查看所有标签名
通过git tag 命令可以查看所有的标签的名字。
git tag
运行结果如下:
注意:标签不是按时间顺序列出,而是按字母排序的。
3.3 推送标签到远程仓库
3.3.1 推送指定标签
通过git push origin tagName 命令可以将指定标签推送到远程仓库。
例如,我想推送标签tagA ,只需要输入以下命令:
git push origin tagA
运行结果如下:
可以看到,输出中有[ new tag ] 字样,这样表明tagA 标签已经推送到了远程仓库。
那么我们怎么查看远程仓库中是否真的已经拥有tagA 标签了呢?
很遗憾,暂时没有直接的Git 命令可以达到这个效果,目前我们只能到对应的仓库查看。
我的远程仓库是放在Github 上的,以这为例子,我们来看下怎么在远程仓库查找标签的存在。
- 进入我们的远程仓库:gitTest。
- 点击releases 选项。
它的左侧是一个标签图标,releases 旁的数字表示标签的数目。
- 切换到Tags 选项卡。
可以看到,在该选项卡中按时间顺序列举了当前仓库中的所有标签。只要点击对应的标签名,就可以查看该标签的具体信息。
事实证明,tagA 标签的确已经被推送到了远程仓库。
3.3.2 推送所有标签
通过git push origin --tags 命令可以将本地的所有未推送到远程仓库的标签一次性推送到远程仓库。
git push origin --tags
运行结果如下:
可以看到,剩下的tagB,tagC 标签也已经被推送到了远程仓库。
3.4 删除标签
3.4.1 删除本地标签
通过git tag -d tagName 命令可以删除指定标签。
例如,我想删除tagB 标签,只需要输入以下命令:
git tag -d tagB
运行结果如下:
可以看到,在本地中的确已经不存在tagB 标签。
3.4.2 删除远程标签
3.4.2.1 :refs/tags/tagName
通过git push origin :refs/tags/tagName 命令可以删除远程仓库上的指定标签。
例如,我想删除远程的tagC 标签,只需要输入以下命令:
git push origin :refs/tags/tagC
运行结果如下:
可以看到,远程的tagC 标签已经被删除,而本地的tagC 标签仍然存在。
3.4.2.2 --delete tagName
通过git push origin --delete tagName 命令也可以删除远程的标签。
例如,我想删除远程的tagA 标签,只需要输入以下命令:
git push origin --delete tagA
运行结果如下:
可以看到,远程的tagA 标签已经被删除,而本地的tagA 标签仍然存在。
四、总结
总结:
今天,我们学习了标签的分类及其用法,主要的命令有:
- 打轻量级标签
git tag tagName commit
- 打有附注标签
git tag -a tagName -m "tagMessaage" commit
- 查看指定标签信息
git show tagName
- 查看本地所有标签
git tag
- 推送指定标签
git push origin tagName
- 推送所有未推送的本地标签
git push origin --tags
- 删除本地标签
git tag -d tagName
- 删除远程标签
git push origin :refs/tags/tagName
git push origin --delete tagName
五、推荐阅读
最后,给大家推荐一个学习Git 命令的网站:
Git 中文开发手册
在这个网站,有对Git 命令更为详细的解读,可以帮助你更为准确的把握住Git 命令的每条用法。
至此,本文结束。我是陈冰安,一个Java学习者。欢迎关注我的公众号【暗星涌动】,愿与你一同进步。