Skip to content

1.标签

1.标签的实质

标签与分支十分相似,都是指向某一次提交;并且,它们的值都为各自指向提交的SHA1值;但是,不同于会随着提交的变化而变化的分支,一旦给某次提交添加了标签,该标签就永远不会发生变化。

「注意」:标签标识的是某一次提交,这次提交可以是任何分支上的任何一次提交

两类标签

Git标签有两种:

  • 「轻量级标签」(lightweight):不可添加注释;
  • 「带有附注的标签」(annotated):可以添加注释;

带注释的标签用于发布,而轻量级标签则用于私人或临时对象

「什么时候打标签呢?」

  • 「版本发布」:一般master分支都会作为项目的发布分支,当项目开发到了一个成熟的阶段,准备在master分支进行发布时。一般都会在master分支的当前提交上打上一个类似"v1.2"的标签

2.创建标签

#添加一个轻量级标签v1.0
git tag v1.0

#带有附注的标签v2.0
git tag -a v2.0 -m 'test'

#查看
git dog

git dog为git log --all --decorate --oneline --graph的别名
#添加一个轻量级标签v1.0
git tag v1.0

#带有附注的标签v2.0
git tag -a v2.0 -m 'test'

#查看
git dog

git dog为git log --all --decorate --oneline --graph的别名

查看存储标签文件的.git/refs/tags目录

  • tags目录下存储着添加的标签文件v1.0v2.0
  • 分别打开标签文件v1.0v2.0,它们的值都是一个SHA1值,并且与添加标签时所在提交mas2SHA16920a6e...相等。
  • emm...等等!并不相等呀,只有v1.0的值与提交mas2SHA1值相等,而与v2.0的值并不相等!
  • 为什么给同一次提交mas2添加的标签,它们的SHA1值会不相等呢?这是因为v1.0是轻量级标签,而v2.0是带有附注的标签

虽然两个标签标记的都是同一次提交,但是它们的构造不一样:

  • 轻量级标签v1.0直接将这次提交的SHA1值作为自己的SHA1值;
  • 而带附注的标签v2.0会创建一个tag对象,它的SHA1值是tag对象的SHA1值;

这就是轻量级标签与带有附注标签的区别。不过这两个标签仍然会指向同一次提交,如下图所示:

3.查看标签

#查看所有
git tag  或者 git tag --list

#查看指定标签


tag与分支并没有关系,它标识的是某次特定的提交


#查看标签内容
git show v1.0
#查看所有
git tag  或者 git tag --list

#查看指定标签


tag与分支并没有关系,它标识的是某次特定的提交


#查看标签内容
git show v1.0

「轻量级标签」

如图所示,该指令会显示标签v1.0所指向的提交;并且,会输出标签指向提交与上一次提交的比较结果;由于标签v1.0指向的提交为master分支的第一次提交,所以上一次提交为null。因此比较结果显示:相比于上一次提交,标签指向的提交1st在文件test.txt中新增了一行1st

「带注释的标签」

相比于轻量级标签,带附注的标签是一个对象,可以存储附注和打标签的人和时间等信息,所以显示的信息多一些;从图中的比较结果可知,相比于上一次提交1st,标签v2.0指向的提交2nd为文件test.txt新增了一行2nd

4.查找标签

git tag -l
该方式支持正则表达式查找;
git tag -l
该方式支持正则表达式查找;

如上图所示:

  • v*表示搜索所有以v开头的标签;
  • ?2*表示搜索任意开头,但包含2的标签;

5.将标签推送到远程

5.1推送所有标签

要将标签推送到远程仓库,首先要建立本地仓库与远程仓库的联系,比如可以采用:

git push -u origin master

或者
git push origin --tag

或者
git push --tag
git push -u origin master

或者
git push origin --tag

或者
git push --tag

5.2指定标签推送

git push origin tag_name
git push origin tag_name

5.3推送个标签到远程

git push origin  v2.0 v3.0
git push origin  v2.0 v3.0

「完整写法为」

git push origin refs/tags/v4.0:refs/tags/v4.0
git push origin refs/tags/v4.0:refs/tags/v4.0

6.删除远程标签

6.1第1种

#只删除远程
git push origin :tag_name
如:
git push origin :v3.0

#完整方式
git push origin :refs/tags/v3.0
#只删除远程
git push origin :tag_name
如:
git push origin :v3.0

#完整方式
git push origin :refs/tags/v3.0

6.2第2种

git push origin --delete tag_name

如:
git push origin --delete v2.0
git push origin --delete tag_name

如:
git push origin --delete v2.0

7.删除本地标签

git tag -d tag_name

如:
#删除
git tag -d v3.0

#查看
git tag
git tag -d tag_name

如:
#删除
git tag -d v3.0

#查看
git tag

8.切换标签

git checkout
git checkout

如图所示,在master分支上进行了三次提交,并且添加了相应的标签:

当我们通过checkout命令切换到标签v2.0

可见,会出现游离的提交。此时查看各分支状态

如上图所示,当前处于标签v2.0指向的提交,并且切换标签的过程中改变了HEAD指针的指向。但是,并没有改变分支master的指向。过程如下图所示:

也就是说,切换标签与使用reset进行版本回退十分相似。只不过切换标签只改变了HEAD指针的指向,会造成游离的提交。若有需要可以创建一个新分支进行保存

9.拉取标签

#拉取所有标签
git pull

#指定标签拉取,前提是已经clone过
git pull git@xxx:xxx/AdServer.git tag_name


#没有clone 过,指定标签
git clone -b 0.8.0 https://gitee.com/xx/xxx.git
#拉取所有标签
git pull

#指定标签拉取,前提是已经clone过
git pull git@xxx:xxx/AdServer.git tag_name


#没有clone 过,指定标签
git clone -b 0.8.0 https://gitee.com/xx/xxx.git
通过shell 脚本自动获取最新tag,并输入最新版本后,推到git上

# 拉取分支上现有的tags

git fetch --tags

echo -e "所有tag列表"
git tag -l -n

echo -e "${tagList}"
#获取最新版本tag
LatestTag=$(git describe --tags `git rev-list --tags --max-count=1`)

echo -e "最新版本tag......"
echo -e "$LatestTag"

echo -e "请输入要新增的版本号...... 如 v1.0.1"
#输入tag名称
read tagName

git tag ${tagName}
#推到分支上
git push origin ${tagName}
通过shell 脚本自动获取最新tag,并输入最新版本后,推到git上

# 拉取分支上现有的tags

git fetch --tags

echo -e "所有tag列表"
git tag -l -n

echo -e "${tagList}"
#获取最新版本tag
LatestTag=$(git describe --tags `git rev-list --tags --max-count=1`)

echo -e "最新版本tag......"
echo -e "$LatestTag"

echo -e "请输入要新增的版本号...... 如 v1.0.1"
#输入tag名称
read tagName

git tag ${tagName}
#推到分支上
git push origin ${tagName}