Git 基础教程

Git 笔记

Git 标签(tag)作用、分支区别及常用命令


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

删除远程标签主要有三种方式:

  1. 使用参数 `--delete`:

    $ git push origin --delete tag <tagname>
  2. 相当于推送一个空分支到远程分支:

    $ git push origin :<tagname>
  3. 先删除本地 tag,再推送一个空的 tag 到远程仓库:

    $ git tag -d <tagname>
    $ git push origin :refs/tags/<tagname>