Git - Tag

作者: 齐晋 | 来源:发表于2018-09-26 11:11 被阅读56次

    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

    参考

    相关文章

      网友评论

          本文标题:Git - Tag

          本文链接:https://www.haomeiwen.com/subject/cjjdoftx.html