Git - Tag
创建tag
给最新提交创建tag
git支持两种创建tag的方式:
- lightweight(轻量级的)
- annotated(带有注释的)
lightweight方式创建的tag,类似于branch,只是存有指向一个commit的索引。这种方式创建的tag数据量很小,但也会丢失一些附加信息(当然不是代码相关的,这个放心)。
annotated方式创建的tag保存有全量的代码。
有校验和、tag名称,email,时间,备注,也能被GNU Privacy Guard (GPG)验证。总之是包含所有信息,也很安全。
除非有特殊情况,推荐使用annotated方式创建的tag
lightweight
语法:
git tag [tagname]
如
git tag v1.4-lw
lightweight创建tag,不需要任何其他参数,只需要在git tag
命令后面跟着tag名称就好了。
如果使用git show
命令来查看这个tag信息的话,只会看到commit,而没有其他额外信息。
$ git show v1.4-lw
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
annotated
语法:
git tag -a [tagname] -m [comments]
如:
git tag -a v1.4 -m "my version 1.4"
-a
: 后面跟着tag名称
-m
: 后面是一条注释
如果使用git show
命令来查看这个tag信息的话,会看到比较全的一些信息
$ git show v1.4
tag v1.4
Tagger: Ben Straub <ben@straub.cc>
Date: Sat May 3 20:19:12 2014 -0700
my version 1.4
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date: Mon Mar 17 21:52:11 2008 -0700
changed the version number
给历史提交创建tag
加入某个时间忘记打tag了,后面又添加了很多commit,还能亡羊补牢,给历史commit打tag吗?
能!
假如历史commit是这样的:
$ git log --pretty=oneline
15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
a6b4c97498bd301d84096da251c98a07c7723e65 beginning write support
0d52aaab4479697da7686c15f77a3d64d9165190 one more thing
6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc added a commit function
4682c3261057305bdd616e23b64b0857d832627b added a todo file
166ae0c4d3f420721acbb115cc33848dfcc2121a started write support
9fceb02d0ae598e95dc970b74767f19372d61af8 updated rakefile
964f16d36dfccde844893cac5b347e7b3d44abbc commit the todo
8a5cbc430f1a9c3d00faaeffd07798508422908a updated readme
本来需要在9fceb02d0ae598e95dc970b74767f19372d61af8
这个commit处打个v1.2的tag的,但是之前忘记了。这样的话,只需照下面的做法,就可以补打tag了:
语法:
git tag -a [tagname] [commit id]
如:
git tag -a v1.2 9fceb02
9fceb02即为commit id
上传tag
默认情况下,git push
命令并不会吧tag上传到remote repository,需要显式地手动push。
git push origin [tagname]
如
git push origin v1.5
$ git push origin v1.5
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (12/12), done.
Writing objects: 100% (14/14), 2.05 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To git@github.com:schacon/simplegit.git
* [new tag] v1.5 -> v1.5
显示tag
想展示当前有哪些tag,只需要执行如下命令:
git tag
或
git tag -l
git tag --list
$ git tag
v0.1
v1.3
如果tag过多的话,可以通过正则表达式搜索:
git tag -l "v1.8.5*"
$ git tag -l "v1.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
切换tag
切换tag与切换branch类似
语法:
git checkout [tagname]
如:
git checkout v1.4
切换到tag后,本地仓库的状态是:detached HEAD
detached HEAD
状态是一种特殊的状态。在这个状态下,你可以进行任何操作,但是都不会对其他分支和远程分支有影响。可认为是个实验性的状态。
可以在此基础上创建一个新的分支:
git checkout -b [new branch name]
当然,如果不想切换到对应的tag,再创建分支的话,可以用如下命令直接创建分支:
git checkout -b [branch name] [tag name]
如:
git checkout -b version2 v2.0.0
删除tag
删除本地tag,语法类似于删除branch
语法:
git tag -d [tagname]
如
git tag -d v1.4-lw
注意,这里只是本地删除了tag,并不会影响远程服务。如果需要删除远程服务的tag,需要执行如下命令:
git push [remote] :refs/tags/[tagname]
如:
git push origin :refs/tags/v1.4-lw
网友评论