git标签详解
# 标签的本质
标签的本质是一次commit,其指向了一个commit对象。它们的值都为各自指向提交的SHA1
值;但是,不同于会随着提交的变化而变化的分支,一旦给某次提交添加了标签,该标签就永远不会发生变化。
标签是一次提交,本次提交可以指向任何分支上的一次提交,且标签定下后,不会再进行改变。
# 标签的分类
- 轻量级标签(
lightweight
):不可添加注释; - 带有附注的标签(
annotated
):可以添加注释;
Annotated tags are meant for release while lightweight tags are meant for private or temporary object labels.
以上是git
官方文档对两种标签的说明,大意是:带注释的标签用于发布,而轻量级标签则用于私人或临时对象。
# 标签何时使用
- 版本发布:一般
master
分支都会作为项目的发布分支,当项目开发到了一个成熟的阶段,准备在master
分支进行发布时。一般都会在master
分支的当前提交上打上一个类似"v1.2
"的标签; - 版本管理:可以通过标签的形式记录项目某一阶段的状态。
# 标签相关命令
# 创建一个标签
- 轻量级标签
git tag 标签名
我们看看一个轻量级的标签的内容:
这里很容易看出来,轻量级的tag内容就是commit。这说明什么
说明:轻量级标签就是代指了一个commit的指针!!它本身就是一个commit
- 带附注的标签
git tag -a 标签名 -m "注释"
创建好的标签文件存放在.git/refs/tags中
其实在git中tag也是一个对象,和commit、tree、blob一样
我们看看这个tag的具体信息:
**可以看到标签中有一个内容指向了具体的commit。**且带附注的tag的SAH1和其指向的SAH1不一致
说明带附注的标签更加重量级,他是一个tag对象,不是commit,只是其内部有指向commit的指针
# 显示标签
git tag 或者git tag --list
切换分支后,使用git tag依然可以展示标签,表示标签与tag是没有关系的
# 显示标签内容
git show 标签名
# 查找标签
支持正则表达式
git tag -l <tag_name>
# 标签推送到远程
默认情况git push 是不会推送tag的。
推送特定的tag
git push origin <tag_name>
推送多个tag
git push origin v2.0 v3.0
推送完整指令
git push origin refs/tags/v4.0:refs/tags/v4.0
推送本地全部的tag
git push origin --tag
# 删除标签
# 删除远程标签
当然,我们可以直接在远程仓库上删除远程标签。但是,最好的方式还是采用命令行进行删除。删除远程标签的方法与删除远程分支的方法非常类似,同样有两种方法:
git push origin :<tag_name>
这种方法相当于推送一个空的标签到远程仓库,由此达到删除的效果。比如删除远程仓库中的标签v3.0
:
git push origin :v3.0
2
这样远程仓库中的标签V3.0
就被删除了:
但是本地仓库中对应的标签V3.0
并没有被删除:
上述指令为简写,完整写法如下:
git push origin :refs/tags/v3.0
2
git push origin --delete <tag_name>
该方法采用了更加语义化的参数--delete
,实现远程标签的删除:
git push origin --delete v2.0
2
同样成功地删除了远程仓库中的标签v2.0
:
但是,本地的标签v2.0
也没有被删除:
采用下列的完整写法,效果是一样的:
git push origin --delete tag v2.0
2
不难发现,删除远程分支和远程标签的方法是一样的。
# 删除本地标签
git tag -d <tag_name>
如通过以下命令删除标签v3.0
:
git tag -d v3.0
# 标签的切换
类似于commit的切换,会产生分离头指针
git checkout tag_name
如图所示,在master
分支上进行了三次提交,并且添加了相应的标签:
当我们通过checkout
命令切换到标签v2.0
时:
可见,会出现游离的提交。此时查看各分支状态:
如上图所示,当前处于标签v2.0
指向的提交,并且切换标签的过程中改变了HEAD
指针的指向。但是,并没有改变分支master
的指向。过程如下图所示:
也就是说,切换标签与使用reset
进行版本回退十分相似。只不过切换标签只改变了HEAD
指针的指向,会造成游离的提交。若有需要可以创建一个新分支进行保存。
# 拉取标签
在下图所示的情况中,本地仓库mygit
与远程仓库有公共的提交历史(同源),并且不发生合并冲突的情况下
可以直接通过git pull
将远程仓库的标签拉取下来,并创建本地仓库中没有的标签: