zoukankan      html  css  js  c++  java
  • Git Tagging

    Git Tagging

    Tag

    git 提供的用来给仓库历史标记特殊的点的功能,一般,会用来在发版的点做标记( v1.0 , v2.0 之类的)。

    展示 tags

    展示已有的 tag 是很简单的,输入 git tag (可以使用可选的 -l 或者 --list

    $ git tag
    v1.0
    v2.0
    

    这个命令根据字典序 列举所有的 tag ;实际的展示顺序通常不重要。

    也可以搜索匹配某个特定模式的 tag。Git 源码仓库,包含了超过 500 个 tag,如果只对 1.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
    
    注释 使用通配符需要 -l 或者 --list 选项
    如果要展示所有的 tag 的话,只需要使用 git tag 就可以了;
    如果要使用通配符来匹配名称的话, -l 或者 --list 的使用是必须的

    创建 tag

    git 支持两种新建 tag 的方式, (轻量级)lightweight(注解型)annotated

    轻量级的 tag 非常像一个不改变的分支——只是对一个特定 commit 的指针。

    注解型的 tag,会作为一个完整的 object 存储到 git 数据库里。会进行校验和;包含有打 tag 的人的名称,邮件,以及日期;有一个 tag 消息;可以使用 GNU Privacy Guard 进行签名和校验。一般来说建议创建注解型的 tag 这样可以保留上述的信息;不过如果想创建临时的不希望保留上述信息的 tag 的话,轻量级的 tag 也是可选择的。

    注解型 tag (Annotated)

    创建注解型 tag 是很简单的。最简单的方式就是在执行 tag 命令的时候指定 -a

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

    -m 指定了 tag 的信息,和 tag 一起存储。如果不给注解型 tag 指定一个消息的话,Git 会打开一个编辑器让你输入(就像 commit 的那样)。

    可以通过 git show 命令来查看提交 tag commit 时候一起设置的数据。

    $ 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
    
        Change version number
    

    会展示

    • 打 tag 的人的信息
    • commit 被打 tag 的时间
    • 在 commit 信息之前展示出来 注解添加的消息。

    轻量级 tag

    另一个给 commit 打 tag 的方式是轻量级 tag,基本上就是保存了 commit 的校验和信息——没有保存其余的信息。如果要创建一个轻量级 tag 的话,不需要提供任何 -a , -s ,或者 -m 的选项,只需要提供一个 tag 名称即可。

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

    这一次,如果在 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
    
        Change version number
    

    给以前的 commit 打 tag

    错过了某些 commit 后,也可以给它们打 tag。假设 commit 历史如下:

    $ git log --pretty=oneline
    15027957951b64cf874c3557a0f3547bd83b3ff6 Merge branch 'experiment'
    a6b4c97498bd301d84096da251c98a07c7723e65 Create write support
    0d52aaab4479697da7686c15f77a3d64d9165190 One more thing
    6d52a271eda8725415634dd79daabbc4d9b6008e Merge branch 'experiment'
    0b7434d86859cc7b8c3d5e1dddfed66ff742fcbc Add commit function
    4682c3261057305bdd616e23b64b0857d832627b Add todo file
    166ae0c4d3f420721acbb115cc33848dfcc2121a Create write support
    9fceb02d0ae598e95dc970b74767f19372d61af8 Update rakefile
    964f16d36dfccde844893cac5b347e7b3d44abbc Commit the todo
    8a5cbc430f1a9c3d00faaeffd07798508422908a Update readme
    

    现在假设在 V1.2 的时候忘记了打 tag,可以在那之后再进行。要给那个 commit 打tag 的话,只需要在命令的最后指定对应的 commit 的校验和(或者一部分)

    $ git tag -a v1.2 9fceb02
    

    打好标记以后可以查看

    $ git tag
    v0.1
    v1.2
    v1.3
    v1.4
    v1.4-lw
    v1.5
    
    $ git show v1.2
    tag v1.2
    Tagger: Scott Chacon <schacon@gee-mail.com>
    Date:   Mon Feb 9 15:32:16 2009 -0800
    
    version 1.2
    commit 9fceb02d0ae598e95dc970b74767f19372d61af8
    Author: Magnus Chacon <mchacon@gee-mail.com>
    Date:   Sun Apr 27 20:43:35 2008 -0700
    
        Update rakefile
    ...
    

    分享 tag

    默认设置下, git push 命令不会向远端的仓库上传 tag。在创建 tag 后,必须明确指定要发送到服务端进行共享的 tag 。这个就跟分享远端的分支是一样的——可以使用 git push origin <tagname>

    $ 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 到服务器的话,可以使用 git push 命令的 --tags 选项。这会把所有远端没有的 tag 都传输到远端的服务器上。

    $ git push origin --tags
    Counting objects: 1, done.
    Writing objects: 100% (1/1), 160 bytes | 0 bytes/s, done.
    Total 1 (delta 0), reused 0 (delta 0)
    To git@github.com:schacon/simplegit.git
     * [new tag]         v1.4 -> v1.4
     * [new tag]         v1.4-lw -> v1.4-lw
    

    现在,别人从仓库 clone 或者 pull 的话,就也会拿到你传上去的 tag。

    删除 Tag

    要在本地的仓库删除一个 tag 的话,可以使用 git tag -d <tagname> 。举例,我们可以像下面这样移除在上面打的轻量级 tag。

    $ git tag -d v1.4-lw
    Deleted tag 'v1.4-lw' (was e7d5add)
    

    注意这并不会删除远端服务器上的 tag。有两个常用的变形,用来删除远端的 tag。

    第一个变形是 git push <remote> :refs/tags/<tagname>

    $ git push origin :refs/tags/v1.4-lw
    To /git@github.com:schacon/simplegit.git
     - [deleted]         v1.4-lw
    

    想要理解这个,就是看做冒号前有一个 null 值,这个 null 值被 push 到了远端的 tag 名称上,也就是把 tag 删除了。

    第二个变形(也更直接)的办法啊就是:

    $ git push origin --delete <tagname>
    

    切到 tag 上

    如果想要查看某个 tag 对应的文件的版本,可以执行这个 tag 的 git checkout ,这会导致仓库进入 "detached HEAD" 的状态。

    $ git checkout v2.0.0
    Note: switching to 'v2.0.0'.
    
    You are in 'detached HEAD' state. You can look around, make experimental
    changes and commit them, and you can discard any commits you make in this
    state without impacting any branches by performing another checkout.
    
    If you want to create a new branch to retain commits you create, you may
    do so (now or later) by using -c with the switch command. Example:
    
      git switch -c <new-branch-name>
    
    Or undo this operation with:
    
      git switch -
    
    Turn off this advice by setting config variable advice.detachedHead to false
    
    HEAD is now at 99ada87... Merge pull request #89 from schacon/appendix-final
    
    $ git checkout v2.0-beta-0.1
    Previous HEAD position was 99ada87... Merge pull request #89 from schacon/appendix-final
    HEAD is now at df3f601... Add atlas.json and cover image
    

    "detached HEAD" 的状态,如果进行了改变并且创建了 commit 的话,tag 不会变化,不过新的 commit 不会属于任何分支并且是不可达的,除了通过明确的 commit hash。因此,如果需要继续拧改变的话——比如说要解决一个以前版本的 bug——最好是新建一个分支。

    $ git checkout -b version2 v2.0.0
    Switched to a new branch 'version2'
    

    如果这样做并且进行了 commit 的话,version2 分支会和 v2.0.0 tag 不同,因为它会根据新的改变变化,所以要小心一些。

  • 相关阅读:
    Vim 在 windows 环境下的初步配置
    空间向量在任意平面的投影公式推导 (矩阵方法)
    jquery中获取元素的几种方式小结
    开源框架
    将插入的新行放入dataGridView的第一行
    go-mod 入门
    docker 常用启动命令
    golang str 首字母大写
    遇到过的几个难搞的问题
    jwt、session、oauth 异同
  • 原文地址:https://www.cnblogs.com/wkmcyz/p/14782307.html
Copyright © 2011-2022 走看看