打标签

一般会给提交历史打个标签,方便后续进行筛选、查看

列出标签

可带上可选的 -l 选项 --list

  1. $ git tag
  2. v1.0
  3. v2.0

这个命令以字母顺序列出标签

可以按照特定的模式查找标签

例如,Git 代码仓库包含标签的数量超过 500 个,只想查 v1.8.5 相关的内容

  1. $ git tag -l "v1.8.5*"
  2. v1.8.5
  3. v1.8.5-rc0
  4. v1.8.5-rc1
  5. v1.8.5-rc2
  6. v1.8.5-rc3
  7. v1.8.5.1
  8. v1.8.5.2
  9. v1.8.5.3
  10. v1.8.5.4
  11. v1.8.5.5
 

标签的分类

Git 支持两种标签

  • 轻量标签(lightweight)
  • 附注标签(annotated)

轻量标签

很像一个不会改变的分支,它只是某个特定提交的引用

附注标签

  • 是存储在 Git 数据库中的一个完整对象,它们是可以被校验的
  • 其中包含打标签者的名字、电子邮件地址、日期时间, 此外还有一个标签信息,并且可以使用 GNU Privacy Guard (GPG)签名并验证
  • 通常会建议创建附注标签,这样可以拥有以上所有信息
  • 但是如果你只是想用一个临时的标签, 或者因为某些原因不想要保存这些信息,那么也可以用轻量标签。

附注标签相关命令

创建附注标签

在运行 tag 命令时指定 -a 选项

  1. $ git tag -a v1.4 -m "my version 1.4"
  2. $ git tag
  3. v0.1
  4. v1.3
  5. v1.4

-m 选项指定了一条将会存储在标签中的信息,如果不加,就会要求你手动输入

查看标签信息和提交信息

通过使用 git show 命令可以看到标签信息和与之对应的提交信息

  1. $ git show v1.4
  2. tag v1.4
  3. Tagger: Ben Straub <ben@straub.cc>
  4. Date: Sat May 3 20:19:12 2014 -0700
  5.  
  6. my version 1.4
  7.  
  8. commit ca82a6dff817ec66f44342007202690a93763949
  9. Author: Scott Chacon <schacon@gee-mail.com>
  10. Date: Mon Mar 17 21:52:11 2008 -0700
  11.  
  12. changed the version number

输出显示了打标签者的信息、打标签的日期时间、附注信息,然后显示具体的提交信息

轻量标签相关命令

本质上是将提交校验和(SHA,那串很长的乱码)存储到一个文件中,没有保存任何其他信息

创建轻量标签

不需要使用 -a-s 或 -m 选项,只需要提供标签名字

  1. $ git tag v1.4-lw
  2. $ git tag
  3. v0.1
  4. v1.3
  5. v1.4
  6. v1.4-lw
  7. v1.5

这时,如果在标签上运行 git show,你不会看到额外的标签信息。 命令只会显示出提交信息

  1. $ git show v1.4-lw
  2. commit ca82a6dff817ec66f44342007202690a93763949
  3. Author: Scott Chacon <schacon@gee-mail.com>
  4. Date: Mon Mar 17 21:52:11 2008 -0700
  5.  
  6. changed the version number

后期打标签

也可以对提交历史打标签

实际栗子

假设提交历史是这样的

  1. $ git log --pretty=oneline
  2. 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
  3. a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
  4. 0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
  5. 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
  6. 0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
  7. 4682c3261057305bdd616e23b64b0857d832627b added a todo file
  8. 166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
  9. 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
  10. 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
  11. 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme

现在,假设在 v1.2 时你忘记给项目打标签,也就是在 “updated rakefile” 的提交历史

补打标签

你可以在之后补上标签。 要在那个提交上打标签,你需要在命令的末尾指定提交的校验和(或部分校验和)

  1. git tag -a v1.2 9fceb02

查看补打标签的信息

  1. $ git tag
  2. v0.1
  3. v1.2
  4. v1.3
  5. v1.4
  6. v1.4-lw
  7. v1.5
  8.  
  9. $ git show v1.2
  10. tag v1.2
  11. Tagger: Scott Chacon <schacon@gee-mail.com>
  12. Date: Mon Feb 9 15:32:16 2009 -0800
  13.  
  14. version 1.2
  15. commit 9fceb02d0ae598e95dc970b74767f19372d61af8
  16. Author: Magnus Chacon <mchacon@gee-mail.com>
  17. Date: Sun Apr 27 20:43:35 2008 -0700
  18.  
  19. updated rakefile
  20. ...

共享标签

  • 默认情况下,git push 命令并不会传送标签到远程仓库服务器上
  • 在创建完标签后你必须显式地推送标签到远程仓库上

推送标签的语法格式

  1. git push <remote> <tagname>

实际栗子

  1. polo@B-J5D1MD6R-2312 watermarker % git push origin2 1.11
  2. 枚举对象中: 17, 完成.
  3. 对象计数中: 100% (17/17), 完成.
  4. 使用 12 个线程进行压缩
  5. 压缩对象中: 100% (12/12), 完成.
  6. 写入对象中: 100% (14/14), 1.47 KiB | 1.47 MiB/s, 完成.
  7. 总共 14(差异 6),复用 0(差异 0),包复用 0
  8. remote: Powered by GITEE.COM [GNK-5.0]
  9. To gitee.com:poloyy/watermarker.git
  10. * [new tag] 1.11 -> 1.11

一次性推送过个标签

如果想要一次性推送很多标签,也可以使用带有 --tags 选项的 git push 命令。 这将会把所有不在远程仓库服务器上的标签全部传送到那里。

  1. git push origin2 --tags
  2. 枚举对象中: 6, 完成.
  3. 对象计数中: 100% (6/6), 完成.
  4. 使用 12 个线程进行压缩
  5. 压缩对象中: 100% (4/4), 完成.
  6. 写入对象中: 100% (5/5), 452 字节 | 452.00 KiB/s, 完成.
  7. 总共 5(差异 2),复用 0(差异 0),包复用 0
  8. remote: Powered by GITEE.COM [GNK-5.0]
  9. To gitee.com:poloyy/watermarker.git
  10. * [new tag] 1.2 -> 1.2
  11. * [new tag] 1.3 -> 1.3

现在,当其他人从仓库中克隆或拉取,他们也能得到这些标签

 

删除标签

删除掉本地仓库上的标签,加个 -d 就行

  1. polo@B-J5D1MD6R-2312 watermarker % git tag
  2. 1.11
  3. 1.2
  4. 1.3
  5. testbu
  6. v1.1
  7. polo@B-J5D1MD6R-2312 watermarker % git tag -d 1.11
  8. 已删除标签 '1.11'(曾为 9baca61
  9. polo@B-J5D1MD6R-2312 watermarker % git tag -d 1.2
  10. 已删除标签 '1.2'(曾为 e4da7ac
  11. polo@B-J5D1MD6R-2312 watermarker % git tag -d 1.3
  12. 已删除标签 '1.3'(曾为 bf12eaa
  13. polo@B-J5D1MD6R-2312 watermarker % git tag
  14. testbu
  15. v1.1

-d 删除标签并不会从任何远程仓库中删除这个标签

删除远程仓库的标签

第一种,--delete

  1. $ git push origin --delete <tagname>

简单粗暴的方式

栗子

  1. polo@B-J5D1MD6R-2312 watermarker % git push origin2 --delete 1.2
  2. remote: Powered by GITEE.COM [GNK-5.0]
  3. To gitee.com:poloyy/watermarker.git
  4. - [deleted] 1.2
  5. polo@B-J5D1MD6R-2312 watermarker % git push origin2 --delete 1.3
  6. remote: Powered by GITEE.COM [GNK-5.0]
  7. To gitee.com:poloyy/watermarker.git
  8. - [deleted] 1.3

第二种 ,传空值

  1. git push <remote> :refs/tags/<tagname>

将冒号前面的空值推送到远程标签名,从而高效地删除它

栗子

  1. polo@B-J5D1MD6R-2312 watermarker % git push origin2 :refs/tags/1.11
  2. remote: Powered by GITEE.COM [GNK-5.0]
  3. To gitee.com:poloyy/watermarker.git
  4. - [deleted] 1.11

checkout 标签

  • 如果想查看某个标签所指向的文件版本,可以使用 git checkout 命令
  • 但仓库处于“分离头指针(detached HEAD)”的状态,会有些小问题存在
  1. polo@B-J5D1MD6R-2312 watermarker % git status
  2. 头指针分离于 testbu
  3. 无文件要提交,干净的工作区

checkout 的栗子

  1. polo@B-J5D1MD6R-2312 watermarker % git checkout testbu
  2. 注意:正在切换到 'testbu'
  3.  
  4. 您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以在切换
  5. 回一个分支时,丢弃在此状态下所做的提交而不对分支造成影响。
  6.  
  7. 如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在 switch 命令
  8. 中添加参数 -c 来实现(现在或稍后)。例如:
  9.  
  10. git switch -c <新分支名>
  11.  
  12. 或者撤销此操作:
  13.  
  14. git switch -
  15.  
  16. 通过将配置变量 advice.detachedHead 设置为 false 来关闭此建议
  17.  
  18. HEAD 目前位于 7fa175d test

查看当前所处分支

  1. polo@B-J5D1MD6R-2312 watermarker % git branch
  2. * (头指针在 1.2 分离)
  3. master

能看到执行 git checkout 之后,本地分支会自动切换到头指针分支

重点

  • 在“分离头指针”状态下,如果做了某些更改然后提交它们,标签不会发生变化
  • 但新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问,看下面的实际栗子
  1. polo@B-J5D1MD6R-2312 watermarker % git push
  2. fatal: 您当前不在一个分支上。
  3. 现在为推送当前(分离头指针)的历史,使用
  4.  
  5. git push origin HEAD:<远程分支名字> 

需要指定远程分支的哈希(就是那串很长的乱码字符串)

因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支

  1. polo@B-J5D1MD6R-2312 watermarker % git checkout -b newtest3 1.2
  2. 切换到一个新分支 'newtest3'
  3. polo@B-J5D1MD6R-2312 watermarker % git branch
  4. master
  5. newtest2
  6. * newtest3

Git 系列教程(9)- 打标签的更多相关文章

  1. [译]Atlassian Git系列教程

    国庆期间把Atlassian的Git系列教程看完了.边看边翻译了相关文章. 原教程: https://www.atlassian.com/git/tutorials/ 我翻译的: git init g ...

  2. Spring 系列教程之自定义标签的解析

    Spring 系列教程之自定义标签的解析 在之前的章节中,我们提到了在 Spring 中存在默认标签与自定义标签两种,而在上一章节中我们分析了 Spring 中对默认标签的解析过程,相信大家一定已经有 ...

  3. Spring 系列教程之默认标签的解析

    Spring 系列教程之默认标签的解析 之前提到过 Spring 中的标签包括默认标签和自定义标签两种,而两种标签的用法以及解析方式存在着很大的不同,本章节重点带领读者详细分析默认标签的解析过程. 默 ...

  4. Git系列教程三 配置与基本命令

    一.安装Git 网上有很多安装教程,可以参考.这里使用的是Windows版本的Git,点击这里下载. 二.基本设置 安装完成后,通过点击鼠标右键就可以看到新添加了俩个Git命令:Git GUI Her ...

  5. git 入门教程之里程碑式标签

    "春风得意马蹄疾,一日看尽长安花",对于项目也是如此,最值得期待的恐怕就要数新版本发布的时刻了吧?每当发布新版本时要么是版本号命名(比如v0.0.1)或者代号命名(比如Chelse ...

  6. Git 系列教程(14)- 远程分支

    远程分支 远程引用是对远程仓库的引用(指针),包括分支.标签等等 你可以通过 git ls-remote <remote> 来显式地获得远程引用的完整列表 polo@B-J5D1MD6R- ...

  7. Git 系列教程(1)- Git 简介

    前言 因为工作中目前要大量使用 Git,虽然之前已经会用了,但没有系统的总结过,现在来重新总结 概念篇会直接搬网上的教程,比如:菜鸟.廖雪峰.老张.中文版Git,就不再花时间自己总结过概念了 Git ...

  8. Git 系列教程(2)- Git 安装

    前言 直接复制官网的教程了,不对自己百度吧,不然就参考下我的几篇文章 Linux安装Git(源码安装) https://www.cnblogs.com/poloyy/p/12186802.html 在 ...

  9. Git 系列教程(3)- 初次运行 Git 前的配置

    前言 直接搬官网教程,再修改下,先啰嗦可以直接看以前的文章 Window初始化Git环境 https://www.cnblogs.com/poloyy/p/12185132.html Linux初始化 ...

随机推荐

  1. git提交本地文件到远程仓库及参与的项目仓库

    1.git提交本地文件到组织 1.先再组织中建立个用于存放文件的仓库建然后复制仓库地址: 2.进入要上传的文件的根目录下右击 git Bash 进入git控制台,我要上传的文件如下: 3.进入后: 1 ...

  2. 常用开发库 - 告別BeanUtils拷贝,MapStruct工具库最全详解

    常用开发库 - MapStruct工具库详解 MapStruct是一款非常实用Java工具,主要用于解决对象之间的拷贝问题,比如PO/DTO/VO/QueryParam之间的转换问题.区别于BeanU ...

  3. Spring Boot 自动装配原理

    Spring Boot 自动装配原理 Spring Boot 在启动之前还有一系列的准备工作,比如:推断 web 应用类型,设置初始化器,设置监听器,启动各种监听器,准备环境,创建 applicati ...

  4. 走进docker-swarm 带大家快速掌握docker自带编排工具

    什么是Docker Swarm? 对比Docker 前面我们介绍过Docker可以理解成是一个我们的服务的独立运行的容器,那么在实际工作中,我们的系统可能是一个微服务应用,系统中根据业务拆分成多个模块 ...

  5. Android Studio 之 通过 Intent 完成点击按钮实现页面跳转

    •Intent 简介 Intent 是 Android 程序中各组件之间进行交互的一种重要方式: 它不仅可以指明当前组件想要执行的动作,还可以在不同组件之间传递数据. Intent 有多个构造函数,其 ...

  6. HTML5新增语法

    ##1.video1.简化版写法:兼容性差```<video src="" controls> </video>``` 2.视频标签标准语法(兼容处理)`` ...

  7. PAT A1032 Sharing

    题意:给出两条链表的首地址以及若干节点的地址,数据,下一个节点的地址,求两条链表的首个共用节点的地址.如果两条链表没有共用节点,则输出-1.思路步骤1:由于地址的范围很小,因此可以直接用静态链表,但是 ...

  8. Chrome扩展开发基础教程(附HelloWorld)

    1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...

  9. day17.网络编程2+进程

    1 加入链接循环的套接字服务端 1.1 服务端 ''' 2.1 基于文件类型的套接字家族 套接字家族的名字:AF_UNIX unix一切皆文件,基于文件的套接字调用的就是底层的文件系统来取数据,两个套 ...

  10. 记一次go中map并发引起的事故

    错误使用map引发的血案 前言 场景复原 原因 参考 错误使用map引发的血案 前言 最近业务中,同事使用map来接收返回的结果,使用waitGroup来并发的处理执行返回的结果,结果上线之后,直接崩 ...