2.6 Git 基础 - 打标签

打标签

同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签。人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做。本节我们一起来学习如何列出所有可用的标签,如何新建标签,以及各种不同类型标签之间的差别。

列显已有的标签

列出现有标签的命令非常简单,直接运行 git tag 即可:

  1. $ git tag
  2. v0.1
  3. v1.3

显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。

我们可以用特定的搜索模式列出符合条件的标签。在 Git 自身项目仓库中,有着超过 240 个标签,如果你只对 1.4.2 系列的版本感兴趣,可以运行下面的命令:

  1. $ git tag -l 'v1.4.2.*'
  2. v1.4.2.1
  3. v1.4.2.2
  4. v1.4.2.3
  5. v1.4.2.4

新建标签

Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。

含附注的标签

创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可:

  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 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。

可以使用 git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。

  1. $ git show v1.4
  2. tag v1.4
  3. Tagger: Scott Chacon <schacon@gee-mail.com>
  4. Date: Mon Feb 9 14:45:11 2009 -0800
  5. my version 1.4
  6. commit 15027957951b64cf874c3557a0f3547bd83b3ff6
  7. Merge: 4a447f7... a6b4c97...
  8. Author: Scott Chacon <schacon@gee-mail.com>
  9. Date: Sun Feb 8 19:02:46 2009 -0800
  10. Merge branch 'experiment'

我们可以看到在提交对象信息上面,列出了此标签的提交者和提交时间,以及相应的标签说明。

签署标签

如果你有自己的私钥,还可以用 GPG 来签署标签,只需要把之前的 -a 改为 -s (译注: 取 signed 的首字母)即可:

  1. $ git tag -s v1.5 -m 'my signed 1.5 tag'
  2. You need a passphrase to unlock the secret key for
  3. user: "Scott Chacon <schacon@gee-mail.com>"
  4. 1024-bit DSA key, ID F721C45A, created 2009-02-09

现在再运行 git show 会看到对应的 GPG 签名也附在其内:

  1. $ git show v1.5
  2. tag v1.5
  3. Tagger: Scott Chacon <schacon@gee-mail.com>
  4. Date: Mon Feb 9 15:22:20 2009 -0800
  5. my signed 1.5 tag
  6. -----BEGIN PGP SIGNATURE-----
  7. Version: GnuPG v1.4.8 (Darwin)
  8. iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
  9. Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
  10. =WryJ
  11. -----END PGP SIGNATURE-----
  12. commit 15027957951b64cf874c3557a0f3547bd83b3ff6
  13. Merge: 4a447f7... a6b4c97...
  14. Author: Scott Chacon <schacon@gee-mail.com>
  15. Date: Sun Feb 8 19:02:46 2009 -0800
  16. Merge branch 'experiment'

稍后我们再学习如何验证已经签署的标签。

轻量级标签

轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -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 15027957951b64cf874c3557a0f3547bd83b3ff6
  3. Merge: 4a447f7... a6b4c97...
  4. Author: Scott Chacon <schacon@gee-mail.com>
  5. Date: Sun Feb 8 19:02:46 2009 -0800
  6. Merge branch 'experiment'

验证标签

可以使用 git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:

  1. $ git tag -v v1.4.2.1
  2. object 883653babd8ee7ea23e6a5c392bb739348b1eb61
  3. type commit
  4. tag v1.4.2.1
  5. tagger Junio C Hamano <junkio@cox.net> 1158138501 -0700
  6. GIT 1.4.2.1
  7. Minor fixes since 1.4.2, including git-mv and git-http with alternates.
  8. gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
  9. gpg: Good signature from "Junio C Hamano <junkio@cox.net>"
  10. gpg: aka "[jpeg image of size 1513]"
  11. Primary key fingerprint: 3565 2A26 2040 E066 C9A7 4A7D C0C6 D9A4 F311 9B9A

若是没有签署者的公钥,会报告类似下面这样的错误:

  1. gpg: Signature made Wed Sep 13 02:08:25 2006 PDT using DSA key ID F3119B9A
  2. gpg: Can't check signature: public key not found
  3. error: could not verify the tag 'v1.4.2.1'

后期加注标签

你甚至可以在后期对早先的某次提交加注标签。比如在下面展示的提交历史中:

  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

我们忘了在提交 “updated rakefile” 后为此项目打上版本号 v1.2,没关系,现在也能做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:

  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. $ git show v1.2
  9. tag v1.2
  10. Tagger: Scott Chacon <schacon@gee-mail.com>
  11. Date: Mon Feb 9 15:32:16 2009 -0800
  12. version 1.2
  13. commit 9fceb02d0ae598e95dc970b74767f19372d61af8
  14. Author: Magnus Chacon <mchacon@gee-mail.com>
  15. Date: Sun Apr 27 20:43:35 2008 -0700
  16. updated rakefile
  17. ...

分享标签

默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:

  1. $ git push origin v1.5
  2. Counting objects: 50, done.
  3. Compressing objects: 100% (38/38), done.
  4. Writing objects: 100% (44/44), 4.56 KiB, done.
  5. Total 44 (delta 18), reused 8 (delta 1)
  6. To git@github.com:schacon/simplegit.git
  7. * [new tag] v1.5 -> v1.5

如果要一次推送所有本地新增的标签上去,可以使用 --tags 选项:

  1. $ git push origin --tags
  2. Counting objects: 50, done.
  3. Compressing objects: 100% (38/38), done.
  4. Writing objects: 100% (44/44), 4.56 KiB, done.
  5. Total 44 (delta 18), reused 8 (delta 1)
  6. To git@github.com:schacon/simplegit.git
  7. * [new tag] v0.1 -> v0.1
  8. * [new tag] v1.2 -> v1.2
  9. * [new tag] v1.4 -> v1.4
  10. * [new tag] v1.4-lw -> v1.4-lw
  11. * [new tag] v1.5 -> v1.5

删除远程tag

在Git v1.7.0 之后,删除tag这么用:

  1. 1. git push origin --delete tag <tagname>
  1. 2. git tag -d <tagname>
  2. git push origin :refs/tags/<tagname>

两种语法作用完全相同。

  1.  

[转] Git 基础 - 打标签的更多相关文章

  1. Git基础-打标签

    打标签 同大多数 VCS 一样,Git 也可以对某一时间点上的版本打上标签.人们在发布某个软件版本(比如 v1.0 等等)的时候,经常这么做.本节我们一起来学习如何列出所有可用的标签,如何新建标签,以 ...

  2. Git 基础 - 打标签

    列出现有标签(或者使用git tag -l) $ git tag v0. v1. 如果只对 1.4.2 系列的版本感兴趣 $ git tag -l 'v1.4.2.*' v1. v1. v1. v1. ...

  3. Git 基础 —— 常用命令

    Git 基础学习系列 Git 基础 -- 安装 配置 别名 对象 Git 基础 -- 常用命令 Git 基础 -- 常见使用场景 Git基础 -- Github 的使用 git init 创建 Git ...

  4. 5.Git基础-撤销操作、标签的使用、Git别名

    1.撤销操作 1.1 修改上一次的提交(commit)--  git commit --amend 有时候我们在提交完成之后才发现有几个文件没有提交,或者发现提交信息填写错了,这时候可以使用 git ...

  5. 『现学现忘』Git基础 — 37、标签tag(二)

    目录 5.共享标签 6.删除标签 7.修改标签指定提交的代码 8.标签在.git目录中的位置 9.本文中所使用到的命令 提示:接上一篇文章内容. 5.共享标签 默认情况下,git push 命令并不会 ...

  6. git基础及分支

    关于版本控制 git是一种分布版本控制系统,每一主机都保存了完整副本.必杀技是分支. 在Windows可安装git客户端msysgit. git基础 第一次看progit觉得有点不懂,不懂版本控制,一 ...

  7. 《Pro Git》笔记2:Git基础操作

    第二章 Git基础 Git基础包括:版本库的创建和获取,文件添加修改提交等基本操作,状态查询,远程版本库管理和同步,打标签. 1.取得项目的Git版本库 基于Git的工作流要以Git版本库为基础,即可 ...

  8. Git详解之二 Git基础

    Git 基础 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 Git 命令,以后绝大多数时间里用到的也就是这几个命令.读完本章,你就能初始化一个新的代码仓库,做一些适当配置: ...

  9. ###Git 基础图解、分支图解、全面教程、常用命令###

    一.Git 基础图解 转自:http://www.cnblogs.com/yaozhongxiao/p/3811130.html Git 图解剖析 git中文件内容并没有真正存储在索引(.git/in ...

随机推荐

  1. java项目命名规范

    一.命名规范 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写. 如:public class MyFirstClass{} 4. 变量 ...

  2. 优化 PHP 代码建议

    1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍.2.$row[’id’] 的速度是$row[id]的7倍.3.echo 比 print 快,并且使用echo的 ...

  3. [转载]SVN如何恢复已删除文件或文件夹

    http://blog.sina.com.cn/s/blog_694d806e0100kaqz.html 用TortoiseSVN: 1.在本地working copy中,用TortoiseSVN-& ...

  4. CocoaPods版本升级

    和往常一样使用CocoaPods管理一个基于FMDB的项目类库 命令行执行 $ pod install [!] The 'master' repo requires CocoaPods 0.32.1 ...

  5. C#深入浅出 修饰符(二)

    1.函数参数前的修饰符 params ,ref ,out params修饰的数据类型只能数组,用于参数不固定时:且此参数位于所有形式参数的最后: public static int GetMax(pa ...

  6. 动态导入(import)和静态导入(import)的区别

    import static静态导入是JDK1.5中的新特性.一般我们导入一个类都用 import com.....ClassName;而静态导入是这样:import static com.....Cl ...

  7. 传统BIOS+UEFI 系统引导修复

    一.    去网上下载一款pe软件:BIOS+UEFI引导修复工具这个软件支持传统bios和最新的UEFI引导(1)进入PE环境(win也可以,不过引导损坏一般不能进win),打开软件         ...

  8. 关于outerWidth()属性

    在写代码的时候,获取元素的宽度通常用到这个属性.此属性具有如下特点: 1.默认情况下,它的值为所有后代元素(含此元素本身)中最大的宽度值. 2.若某后代元素的display属性为none,那么在计算的 ...

  9. Inorder Successor in Binary Search Tree

    Given a binary search tree (See Definition) and a node in it, find the in-order successor of that no ...

  10. 关于Promise:你可能不知道的6件事

    FROM ME : 文章介绍了6个Promise的知识点: 1.then() 返回一个 forked Promise(分叉的 Promise):返回的有两种情况: 2.回调函数应该传递结果:在 pro ...