第八讲:Git标签、别名与Git gc
前言
这一节主要介绍Git
标签、别名与Git
的垃圾回收机制。
一、Git
标签(tag
)
1.标签的实质
标签与分支十分相似,都是指向某一次提交;并且,它们的值都为各自指向提交的SHA1
值;但是,不同于会随着提交的变化而变化的分支,一旦给某次提交添加了标签,该标签就永远不会发生变化。
「注意」:标签标识的是某一次提交,这次提交可以是任何分支上的任何一次提交。
两类标签
Git
标签有两种:
- 「轻量级标签」(
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
"的标签;比如
Vue
框架:image-20200418125541646 可以看到有许多标签,并且可以在
releases
选项中查看标签和发布版本:image-20200418125721571 「版本管理」:可以通过标签的形式记录项目某一阶段的状态,方便管理;
比如管理学习微信小程序时每个知识点的代码:
image-20200418165957032
「查看标签文件」
如下图所示,分别给master
分支的提交mas2
添加一个轻量级标签v1.0
和一个带有附注的标签v2.0
:
![424ced1822af56815209d769c643f4d7.png](https://i-blog.csdnimg.cn/blog_migrate/52426f1d7a831121ca1e2fe19c440b6e.png)
❝❞
git dog
为git log --all --decorate --oneline --graph
的别名,后面会讲解;
随后,查看存储标签文件的.git/refs/tags
目录:
![8889c747ae2d7ea5e4701b1a18a8d7ae.png](https://i-blog.csdnimg.cn/blog_migrate/1ce525550eb9ca1285437d0af6de52eb.png)
可以看到:
tags
目录下存储着添加的标签文件v1.0
和v2.0
;- 分别打开标签文件
v1.0
和v2.0
,它们的值都是一个SHA1
值,并且与添加标签时所在提交mas2
的SHA1
值6920a6e...
相等。 emm...
等等!并不相等呀,只有v1.0
的值与提交mas2
的SHA1
值相等,而与v2.0
的值并不相等!- 为什么给同一次提交
mas2
添加的标签,它们的SHA1
值会不相等呢?这是因为v1.0
是轻量级标签,而v2.0
是带有附注的标签。
虽然两个标签标记的都是同一次提交,但是它们的构造不一样:
轻量级标签
v1.0
直接将这次提交的SHA1
值作为自己的SHA1
值;而带附注的标签
v2.0
会创建一个tag
对象,它的SHA1
值是tag
对象的SHA1
值;
这就是轻量级标签与带有附注标签的区别。不过这两个标签仍然会指向同一次提交,如下图所示:
![b544920358aa7ebefe26bb61eeea61dd.png](https://i-blog.csdnimg.cn/blog_migrate/50da035da7f806693a55d173f5897e84.png)
2.创建标签
git tag
创建一个轻量级标签: