2.6 打标签
打标签像其他版本控制系统一样Git 可以给仓库历史中的某一个提交打上标签以示重要。比较有代表性的是人们会使用这个功能来标记发布结点v1.0、v2.0等等。本节将介绍如何列出已有的标签、如何创建和删除新的标签、以及不同类型的标签分别是什么。列出标签在 Git 中列出已有的标签非常简单只需要输入git tag可带上可选的-l或--list选项$gittag v1.0 v2.0这个命令以字母顺序列出标签但显示顺序并不重要。你也可以按照特定的模式查找标签。例如Git 自身的源代码仓库包含标签的数量超过 500 个。如果只对 1.8.5 系列感兴趣可以运行$gittag-lv1.8.5*v1.8.5 v1.8.5-rc0 v1.8.5-rc1 v1.8.5-rc2 v1.8.5-rc3 v1.8.5.1 v1.8.5.2 v1.8.5.3 v1.8.5.4 v1.8.5.5注意按照通配符列出标签需要-l或--list选项。如果只想要完整的标签列表运行git tag会默认假定你想要一个列表并直接列出此时-l或--list是可选的。但如果提供了匹配标签名的通配模式-l或--list就是强制使用的。创建标签Git 支持两种标签轻量标签lightweight与附注标签annotated。轻量标签很像一个不会改变的分支——它只是某个特定提交的引用。附注标签是存储在 Git 数据库中的一个完整对象可以被校验其中包含打标签者的名字、电子邮件地址、日期时间此外还有一个标签信息并且可以使用 GNU Privacy GuardGPG签名并验证。通常建议创建附注标签以便保留以上所有信息。但如果只是想用一个临时标签或者因某些原因不需要保存这些信息轻量标签也完全够用。附注标签创建附注标签最简单的方式是在运行tag命令时指定-a选项$gittag-av1.4-mmy version 1.4$gittag v0.1 v1.3 v1.4-m选项指定了一条将会存储在标签中的信息。如果没有为附注标签指定信息Git 会启动编辑器要求你输入。通过git show命令可以看到标签信息和与之对应的提交信息$gitshow v1.4 tag v1.4 Tagger: Ben Straubbenstraub.ccDate: Sat May320:19:122014-0700my version1.4commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chaconschacongee-mail.comDate: Mon Mar1721:52:112008-0700changed the version number输出显示了打标签者的信息、打标签的日期时间、附注信息然后显示具体的提交信息。轻量标签创建轻量标签不需要使用-a、-s或-m选项只需提供标签名字$gittag v1.4-lw $gittag v0.1 v1.3 v1.4 v1.4-lw v1.5如果在轻量标签上运行git show不会看到额外的标签信息命令只会显示出提交信息$gitshow v1.4-lw commit ca82a6dff817ec66f44342007202690a93763949 Author: Scott Chaconschacongee-mail.comDate: Mon Mar1721:52:112008-0700changed the version number后期打标签你也可以对过去的提交打标签。假设提交历史如下$gitlog--prettyoneline 15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branchexperimenta6b4c97498bd301d84096da251c98a07c7723e65 beginningwritesupport 0d52aaab4479697da7686c15f77a3d64d9165190 onemorething 6d52a271eda8725415634dd79daabbc4d9b6008e Merge branchexperiment0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commitfunction4682c3261057305bdd616e23b64b0857d832627b added a todofile166ae0c4d3f420721acbb115cc33848dfcc2121a startedwritesupport 9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile 964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo 8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme假设在 v1.2 时忘记给项目打标签即 “updated rakefile” 提交可以在之后补上。在命令末尾指定提交的校验和或部分校验和即可$gittag-av1.2 9fceb02验证标签已打上$gittag v0.1 v1.2 v1.3 v1.4 v1.4-lw v1.5 $gitshow v1.2 tag v1.2 Tagger: Scott Chaconschacongee-mail.comDate: Mon Feb915:32:162009-0800version1.2commit 9fceb02d0ae598e95dc970b74767f19372d61af8 Author: Magnus Chaconmchacongee-mail.comDate: Sun Apr2720:43:352008-0700updated rakefile共享标签默认情况下git push命令并不会传送标签到远程仓库服务器上。创建完标签后必须显式地推送标签到共享服务器。这个过程就像共享远程分支一样——运行git push origin tagname$gitpush origin v1.5 Counting objects:14, done. Delta compression using up to8threads. Compressing objects:100%(12/12), done. Writing objects:100%(14/14),2.05KiB|0bytes/s, done. Total14(delta3), reused0(delta0)To gitgithub.com:schacon/simplegit.git *[new tag]v1.5 -v1.5如果想要一次性推送很多标签可以使用--tags选项。这会将所有不在远程仓库服务器上的标签全部传送过去$gitpush origin--tagsCounting objects:1, done. Writing objects:100%(1/1),160bytes|0bytes/s, done. Total1(delta0), reused0(delta0)To gitgithub.com:schacon/simplegit.git *[new tag]v1.4 -v1.4 *[new tag]v1.4-lw -v1.4-lw现在当其他人从仓库中克隆或拉取他们也能得到你的那些标签。注意git push remote --tags推送标签并不会区分轻量标签和附注标签没有简单的选项能够让你只选择推送其中一种。删除标签要删除本地仓库上的标签使用git tag -d tagname$gittag-dv1.4-lw Deleted tagv1.4-lw(was e7d5add)注意上述命令并不会从任何远程仓库中移除这个标签你必须用以下两种方式之一来更新远程仓库。方式一将冒号前面的空值推送到远程标签名从而高效地删除它$gitpush origin :refs/tags/v1.4-lw To /gitgithub.com:schacon/simplegit.git -[deleted]v1.4-lw方式二更直观的删除远程标签命令$gitpush origin--deletetagname检出标签如果你想查看某个标签所指向的文件版本可以使用git checkout命令但这会使你的仓库处于分离头指针detached HEAD的状态——这个状态有些不好的副作用$gitcheckout2.0.0 Note: checking out2.0.0.You areindetached HEADstate. You canlookaround,makeexperimental changes and commit them, and you can discard any commits youmakeinthis state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you maydoso(now or later)by using-bwith the checkoutcommandagain. Example:gitcheckout-bnew-branchHEAD is now at 99ada87... Merge pull request#89 from schacon/appendix-final在分离头指针状态下如果你做了某些更改然后提交它们标签不会发生变化但你的新提交将不属于任何分支并且将无法访问除非通过确切的提交哈希才能访问。因此如果你需要进行更改比如修复旧版本中的错误通常需要创建一个新分支$gitcheckout-bversion2 v2.0.0 Switched to a new branchversion2如果在这之后又进行了一次提交version2分支就会因为这个改动向前移动此时它就会和v2.0.0标签稍微有些不同这时就要当心了。