这个命令,其实很有用,类似clearcase中的label,就是给一个版本设置一个标记(标签),方便后期查找特定的版本。

tag和commit的sha1那串字符串的关系,不是很大,但是还是要说一下的。

1. 每一次修改,在本地仓库中,只有commit了,在ref中有新的相关的记录,才可以做push到远端。否则会提示你Everything is up-to-date.

 [root@CloudGame mueas]# ll
total
-rw-r--r-- root root Jan : pom.xml
drwxr-xr-x root root Jan : src
[root@CloudGame mueas]# git status        #git status查看当前是否有新的修改发生,结果显示没有修改。
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
[root@CloudGame mueas]# git push         #push一个干净的工作目录,你会看到什么都是最新的,意思是没有必要push
Everything up-to-date

2. 没有commit得到的那个sha1的字符串,是不允许给执行git tag加标签的。否则,你会遇到错误!

 [root@CloudGame hello]# ll -al                #查看当前本地repo中的内容,显示什么都没有
total
drwxr-xr-x root root Jan : .
drwxr-xr-x. shihuc shihuc Jan : ..
drwxr-xr-x root root Jan : .git
[root@CloudGame hello]# git status              #查看当前repo的状态信息。也是说没有东西commit
On branch master Initial commit nothing to commit (create/copy files and use "git add" to track)
[root@CloudGame hello]# git tag ht001            #创建轻量级标签ht001,提示错误
fatal: Failed to resolve 'HEAD' as a valid ref.
[root@CloudGame hello]# git tag -a ht001 -m "first one tag for initial repo"    #创建注解标签,同样报错
fatal: Failed to resolve 'HEAD' as a valid ref.

根据这个提示信息,很容易知道原因,就是没有东西commit,所以不让做tag。只有commit了,才可以打标签。我们可以看看下面:

 [root@CloudGame hello]# touch README.txt      #创建一个文件
[root@CloudGame hello]# git status          #查看状态信息。显示有意个没有被跟踪的文件
On branch master Initial commit Untracked files:
(use "git add <file>..." to include in what will be committed) README.txt nothing added to commit but untracked files present (use "git add" to track)
[root@CloudGame hello]# git add README.txt               #添加README.txt到本地repo
[root@CloudGame hello]# git commit -m "README is created"      #commit这个文件
[master (root-commit) d4e04d6] README is created
file changed, insertions(+), deletions(-)
create mode README.txt
[root@CloudGame hello]# git status                    #再次查看当前repo的信息,显示当前没有东西可以commit。工作目录是干净的。
On branch master
Your branch is based on 'origin/master', but the upstream is gone.
(use "git branch --unset-upstream" to fixup)
nothing to commit, working directory clean
[root@CloudGame hello]# vim .git/refs/heads/master           
[root@CloudGame hello]# cat .git/refs/heads/master           #由于当前在master分支,所以查看这个分支文件的内容,显示为当前的commit的sha1字符串
d4e04d68c5aa5b316167a1c3baa63faabb06cf80
[root@CloudGame hello]#
[root@CloudGame hello]# git log
commit d4e04d68c5aa5b316167a1c3baa63faabb06cf80
Author: chengsh <shihu.cheng@000000.com>
Date: Thu Jan :: + README is created

最后,在有了这个commit的内容后,先检查下.git/refs/tags/目录下有没有内容!从下面的日志看,是什么都没有的,空的。

 [root@CloudGame hello]# ll .git/refs/
total
drwxr-xr-x root root Jan : heads
drwxr-xr-x root root Jan : tags
[root@CloudGame hello]# ll .git/refs/tags/
total

那么,这个时候添加tag,会是什么样子呢?往下看:

 [root@CloudGame hello]# git tag -a ht001 -m "first tag"    #添加一个注解类型的标签,添加基本类型(轻量级)的也同样可以。
[root@CloudGame hello]#
[root@CloudGame hello]# ll .git/refs/tags/            #查看tags目录下有没有东西,显示有一个标签命名的文件  
total
-rw-r--r-- root root Jan : ht001
[root@CloudGame hello]#
[root@CloudGame hello]# cat .git/refs/tags/ht001         #查看这个标签文件内容是什么,一串字符
6e032b380494c7a230686a00533ea4ad1ab2961a

到此,可以看出tag和commit的关系了吧。要想tag,必须先有commit。clearcase当中,可以给一个节点添加多个label,那git里面能否给一个commit号(sha1字符串)添加多个标签呢?我们往下看:

 [root@CloudGame hello]# git tag ht002
[root@CloudGame hello]#
[root@CloudGame hello]# ll -al .git/refs/tags/
total
drwxr-xr-x root root Jan : .
drwxr-xr-x root root Jan : ..
-rw-r--r-- root root Jan : ht001
-rw-r--r-- root root Jan : ht002
[root@CloudGame hello]# cat .git/refs/tags/ht002
d4e04d68c5aa5b316167a1c3baa63faabb06cf80
[root@CloudGame hello]#

上面的操作日志显示,给同一个commit后的操作,添加多个tag是可以的,每次的tag标签对应的sha1字符串不同。

下面看看,操作tag后,gitk显示的内容是什么?

再来看看ht002标签的信息对应的内容:

从上图,可以发现,基本类型的tag对应的信息,那个sha1串头是tree字样。而注解类型的tag中sha1串头对应的字样是object。这也是一个小区别。

下面,列举一下tag常见的操作指令:

切换到标签 git checkout <tagname>
查看标签的版本信息 git show <tagname>
删除标签 git tag -d <tagname>
给指定的commit打标签 git tag -a <tagname> [-m <your comment>] <commit-sha1-id>
发布指定的标签到远程仓库 git push origin <tagname>
将本地的标签全部发布到远程仓库 git push origin --tags
查看当前分支下的所有标签信息 git tag
删除远程tag  

git tag -d <tagname>;

git push origin :<tagname>

最后补充说明一下,通常git push的时候,标签信息是不会被一起发布到远程仓库的。删除远程分支和标签类似,都是先删除本地的分支或则标签,然后push这个分支或则标签到远程仓库。都要注意的一点就是origin与冒号之间有一个空格。否则会出错的。

git tag知多少的更多相关文章

  1. git必知必会

    1. Git 配置 --system #系统级别--global #用户全局--local #单独一个项目 git config --global user.name "xxxx" ...

  2. repo 导出本地 git tag 给他人

    背景 使用 repo 管理了多个 git 仓库,有时需要将本地仓库的tag同步给其他人,但又不能直接推到远程(例如权限问题). 实际场景举例 本地复现了一个问题,需要让其他人回退到相同环境来排查. 本 ...

  3. git tag使用标记

    git跟其它版本控制系统一样,可以打标签(tag), 作用是标记一个点为一个版本号,如0.1.3, v0.1.7, ver_0.1.3.在程序开发到一个阶段后,我们需要打个标签,发布一个版本,标记的作 ...

  4. Git tag push 到远端仓库

    很早之前,我们就提到过用Git tag来给工程打上标签,但是这个命令只是在本地仓库打标签而已, 为了能把标签同步到远程服务器,我们可以这样做: 默认情况下,git push并不会把tag标签传送到远端 ...

  5. git tag — 标签相关操作

    标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ Git tag # 在控制台打印出当前仓库的所有标签$ git tag -l 'v0.1.*' # 搜索符合模式的标签 打标签 gi ...

  6. Git tag 给当前分支打标签

    原文已经找不到出处,重新整理格式,仅作个人收藏! 标签(Tag)可以针对某一时间点的版本做标记,常用于版本发布. 列出tag $ git tag # 在控制台打印出当前仓库的所有tag $ git t ...

  7. git命令之git tag 给当前分支打标签

    git tag - 标签相关操作 发表于 2011年06月29日 由 机器猫 标签可以针对某一时间点的版本做标记,常用于版本发布. 列出标签 $ git tag # 在控制台打印出当前仓库的所有标签$ ...

  8. git tag查看、创建与删除

    tag管理 查看tag 太多的话用 grep 过滤 $ git tag | grep dev_20150525 # 创建tag $ git tag -a dev_20150525_16 -m 'xxx ...

  9. git tag的使用

    查看所有的标签git tag 删除某一个标签git tag -d tagName 创建带注释的标签 git tag -a tagName -m "annotate" 轻量级标签 g ...

随机推荐

  1. Java字符串null相加

    Java字符串null相加 最近和同事讨论了下面的一段代码: String a = null; a += a; System.out.println(a); 运行结果: nullnull 本着学习的态 ...

  2. Install Fastx (zz)

    Fastx-toolkit installation on CentOS ===================================== Tested on CentOS release ...

  3. iOS学习笔记---c语言第十天

    动态内存分配 一.存储区划分 从低到高(内存地址小----内存地址大)  :  代码区---常量区---静态区---堆区---栈区 栈内存 //凡是在函数体内定义的变量 都存储在栈区(包括形参). ; ...

  4. CentOS终端界面登入Linux

    上述图片中,前两行为CentOS的版本信息,其内容来自于/etc/issue这个档案中. 后三行:www login:其中www表示主机名(设主机名为www.vbird.tsal),主机名显示通常只取 ...

  5. db2 存储过程 语法 及结果集查询

    第一次用存储过程,关于处理待办的,不知道怎么执行和传参数 给存储过程 ,其实就一句话很简单. @call PRC_MISSIONLIST_QUERY('27020214', '27040000', ' ...

  6. 权限分配界面 纯手工 仅用到bootstrap的架构 以及 c标签

    <div class="form-group">        <div class="row">         <label ...

  7. Spring MVC 属性文件读取注入到静态字段

    目录(?)[-] servlet-contextxml configproperties 示例属性 ConfigInfo 对应的配置bean 使用   在项目中,有些参数需要配置到属性文件xxx.pr ...

  8. Ubuntu12.04安装中文字体(转)

    1.在/usr/share/fonts/下,新建文件夹winFonts,如果没有fonts目录,就安装fontconfig软件(系统字体管理),再将win7字体msyh.ttf和msyhbd.ttf复 ...

  9. POJ3352 Road Construction(边双连通分量)

                                                                                                         ...

  10. iOS 导出 ipa 包时 三个选项的意义

    OS 导出 ipa 包时 三个选项的意思 如图  在 iOS 到处 ipa包的时候 会有三个选项 Save for iOS App Store Deployment Save for Ad Hoc D ...