Git 跟其它版本控制系统一样,可以对某一时间点上的版本打上标签。在做版本发布的时候经常会用到。尽管 Git 只实现了一种标签对象,但是有两种基本的标签类型,通常称为轻量级的(lightweight)和带附注的(annotated)。
Git 标签的作用通俗来说,tag 指向一次 commit 的 id,给开发分支做一个标记,如标记一个版本号等。标签相关命令以 git tag 开头。
标签类型
轻量级标签:就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。通常被版本库视为是私有的。这些标签并不在版本库里创建永久对象。
含附注标签:实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身可以根据 RFC 4880 来使用 GNU Privacy Guard(GPG)密钥进行数字签名。
总结的说就是轻量级标签是一个引用,附注标签是一个独立的对象。一般建议使用附注标签,以保留相关详细信息。
标签与分支的区别
标签是当前分支上的一个标记,其实道理和 commit 的 commit-sha1 有些相似,其实就是给当前的版本做个标记,以便回退到此版本。如果使用 commit-sha1,大家都记不住那条冗长的 sha1 码,所以用 tag 标签来做记录;而分支(branch)是一条可变的另一个“跑道”。
概括来讲就是两点显著的区别:
- tag 就像是一个里程碑一个标志一个点,branch 是一个新的征程一条线;
- tag 是静态的,不可改变,branch 是变化的,要向前走;
标签常用命令
标签提交
在当前分支的当前提交节点,新建轻量级标签(无需指定任何额外参数) :
$ git tag v1.0.0_lw
新建附注标签,`-a` 参数后接标签名称,`-m` 参数添加标签说明:
$ git tag -a v1.6 -m "version 1.6"
对过去指定的提交(commit id)上打标签,指定对应 commit id(示例中的 9fceb02
) 即可,若不指定 commit id,即默认在当前 HEAD 上打标签:
$ git tag -a v1.6 9fceb02 -m "version 1.6"
提交一个标签到远程仓库的命令:
$ git push origin v1.6
一次提交本地的所有标签到远程仓库的命令:
$ git push origin --tags
标签查看
查看本地指定标签对应的信息:
$ git show v1.6
查看本地所有的标签列表:
$ git tag
列出远程仓库中所有的标签:
$ git ls-remote --tags
获取远程标签到本地:
$ git fetch origin tag <tagname>
标签删除
删除本地的标签:
$ git tag -d v0.9
删除远程标签主要有三种方式:
-
使用参数 `--delete`:
$ git push origin --delete tag <tagname>
-
相当于推送一个空分支到远程分支:
$ git push origin :<tagname>
-
先删除本地 tag,再推送一个空的 tag 到远程仓库:
$ git tag -d <tagname> $ git push origin :refs/tags/<tagname>