Git 系列 4:如何优雅的使用标签

@[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 上的,以这为例子,我们来看下怎么在远程仓库查找标签的存在。

  1. 进入我们的远程仓库:gitTest。
  2. 点击releases 选项。
    在这里插入图片描述

    它的左侧是一个标签图标,releases 旁的数字表示标签的数目。

  3. 切换到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 标签仍然存在。

四、总结

总结:
今天,我们学习了标签的分类及其用法,主要的命令有:

  1. 打轻量级标签
git tag tagName commit
  1. 打有附注标签
git tag -a tagName -m "tagMessaage" commit
  1. 查看指定标签信息
git show tagName
  1. 查看本地所有标签
git tag
  1. 推送指定标签
git push origin tagName
  1. 推送所有未推送的本地标签
git push origin --tags
  1. 删除本地标签
git tag -d tagName
  1. 删除远程标签
git push origin :refs/tags/tagName
git push origin --delete tagName

五、推荐阅读

最后,给大家推荐一个学习Git 命令的网站:

Git 中文开发手册

在这里插入图片描述

在这个网站,有对Git 命令更为详细的解读,可以帮助你更为准确的把握住Git 命令的每条用法。

至此,本文结束。我是陈冰安,一个Java学习者。欢迎关注我的公众号【暗星涌动】,愿与你一同进步。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335