一、什么是 Git 标签?
Git 标签是一个固定的指向 commit 的引用,类似于一个代码库的“里程碑”或“版本号”,提供了一个简单易懂的方式来标记重要的提交。标签是以轻量(Lightweight)标签和注解(Annotated)标签两种形式进行发布,轻量标签很像一个不会改变的分支,它只是一个特定提交的引用而已,而注解标签是存储在 Git 数据库中的一个完整的对象,它包含标签本身的名字、电子邮件地址、日期时间、附注以及可以对其进行数字签名而生成的 GPG(GNU Privacy Guard)签名等信息。
下面列出一些常用的标签命令。
1. 列出所有标签:git tag
2. 新建标签:git tag [tagname]
3. 基于 commit 新建标签:git tag [tagname] [commit hash]
4. 查看标签信息:git show [tagname]
5. 删除标签:git tag -d [tagname]
6. 将标签推送到远程仓库:git push origin [tagname]
7. 删除远程仓库标签:git push origin :refs/tags/[tagname]
8. 从远程仓库拉取标签:git fetch origin [tagname]
9. 检出标签:git checkout [tagname]
二、如何打轻量标签?
轻量标签非常适合快速打一个类似于版本号的标记。创建一个轻量标签的方式非常简单,只需要使用 "git tag [tagname]" 命令即可。一个常见错误是在试图打轻量标签时输入 "-a" 选项或 "-m" 选项。这些选项用于创建注解标签,而轻量标签不支持注解。
下面演示如何创建轻量标签。
# 列出当前的提交历史
$ git log --oneline
1c03820 (HEAD -> master) update readme file
18e62db add new function
b7e9a3e first commit
# 打一个 v1.0 的轻量标签,指向当前的 HEAD
$ git tag v1.0
# 列出所有标签
$ git tag
v1.0
三、如何打注解标签?
注解标签提供了完整的标签信息,并存储在 Git 数据库中。它们是由一个指定版本的提交、一个标签名字、一个注解信息和可能的数字签名组成。注解标签适合于发布新版本或者里程碑。
下面演示如何创建注解标签。
# 打一个 v2.0 的标签并添加注解信息
$ git tag -a v2.0 -m "Release version 2.0"
# 查看标签信息
$ git show v2.0
tag v2.0
Tagger: Zhang San
Date: Fri Oct 11 14:11:25 2019 +0800
Release version 2.0
commit 1c03820a1750b41c27f9be76477d0cdef267ea56 (HEAD -> master)
Author: Zhang San
Date: Fri Oct 11 13:30:47 2019 +0800
update readme file
四、如何分享标签?
一个标签默认是存在本地的,不会被自动推送到远程服务器。如果你想要分享这个标签,你必须通过执行 "git push [remote] [tagname]" 命令显式地推送到远程服务器,或者通过执行 "git push --tags" 命令推送所有(本地)标签。
下面演示如何分享标签。
# 推送单个标签
$ git push origin v1.0
# 推送所有本地标签
$ git push --tags
五、如何删除标签?
删除一个本地标签非常简单,只需在删除标签命令中指定标签的名称即可:"git tag -d [tagname]"。但是,如果已经将标签推送到远程仓库,你需要在推送命令中明确指定它,并使用冒号前缀加上标签名称("git push [remote] :refs/tags/[tagname]")。
下面演示如何删除标签。
# 删除本地标签
$ git tag -d v2.0
# 从远程仓库删除标签
$ git push origin :refs/tags/v2.0
六、如何检出特定标签?
检出标签意味着切换到标签所指向的 commit,这个 commit 可以是普通的提交对象,也可以是一个特殊的 Git 对象,如分支(branch)或特定的提交。当你检出一个标签时,你会进入“分离头指针”的状态,这意味着你不再位于任何分支上,并且不会自动推进提交历史(即你所做的每个操作都会在特定的分离头指针上直接引用)。
下面演示如何检出标签。
# 检出 v1.0 标签并进入"分离头指针"状态
$ git checkout tags/v1.0
# 检出并创建基于标签 v1.0 的分支
$ git checkout -b new_branch tags/v1.0