代码之家  ›  专栏  ›  技术社区  ›  Igor Zevaka

如何判断在Git中提交标记指向哪个?

  •  343
  • Igor Zevaka  · 技术社区  · 15 年前

    我在存储库中有许多未标记的标签,我想知道它们指向哪个提交。有没有只列出标签和它们的提交shas的命令?检查标签和看头部对我来说似乎有点费力。

    更新

    我在回答完这些问题后意识到,我真正想要的是简单地看看标签前面的历史,因为 git log <tagname> 足够了。

    标记为answer的答案对于获取标记及其提交列表很有用,这就是我所要求的。有了一些shell黑客,我确信可以将它们转换成sha+commit消息。

    18 回复  |  直到 6 年前
        1
  •  273
  •   mipadi    9 年前

    一种方法是 git rev-list . 下面将输出标记指向的提交:

    $ git rev-list -n 1 $TAG
    

    您可以将其作为别名添加到 ~/.gitconfig 如果你经常使用它:

    [alias]
      tagcommit = rev-list -n 1
    

    然后打电话给:

    $ git tagcommit $TAG
    
        2
  •  207
  •   Roger Lipscombe    9 年前
    git show-ref --tags
    

    例如, git show-ref --abbrev=7 --tags 将向您显示如下内容:

    f727215 refs/tags/v2.16.0
    56072ac refs/tags/v2.17.0
    b670805 refs/tags/v2.17.1
    250ed01 refs/tags/v2.17.2
    
        3
  •  89
  •   Hlung    7 年前

    只使用 git show <tag>

    但是,它也会转储提交差异。要忽略这些差异,请使用 git log -1 <tag> . (感谢@dolphindream和@demisx!)

        4
  •  33
  •   orip    14 年前

    在我的存储库中, git show-ref TAG 显示标记的哈希,而不是它指向的提交的哈希。

    git show-ref --dereference TAG 此外,还显示了所指向的提交。

        5
  •  32
  •   Jakub Narębski adamtaub    15 年前

    使用

    git rev-parse --verify <tag>^{commit}
    

    (这将返回提交的sha-1,即使对于带注释的标记也是如此)。


    git show-ref <tag> 如果 <tag> 没有注释。总是有 git for-each-ref (有关详细信息,请参阅文档)。

        6
  •  32
  •   3 revs, 2 users 80%<br/>user456814&#13;    7 年前

    Igor Zevaka 以下内容:

    总结

    因为有大约4个几乎同样可以接受但不同的答案,我将总结出所有不同的方式来剥皮标签。

    1. git rev-list -1 $TAG ( answer ) git rev-list 输出导致 $TAG 类似 git log 但只显示了承诺的sha1。这个 -1 将输出限制为它指向的提交。

    2. git show-ref --tags ( answer )将显示所有标签(本地和从远程获取)及其sha1。

    3. git show-ref $TAG ( answer )将显示标记及其路径以及sha1。

    4. git rev-parse $TAG ( 回答 )将显示未标记标签的sha1。

    5. git rev-parse --verify $TAG^{commit} ( 回答 )将显示注释和未注释标记的sha1。浅谈Windows的使用 git rev-parse --verify %TAG%^^^^{commit} (四顶帽子)。

    6. cat .git/refs/tags/* cat .git/packed-refs ( answer )取决于标签是本地的还是从远程获取的。

        7
  •  15
  •   ScottJShea bdub13    10 年前

    这个怎么样?

    git log -1 $TAGNAME
    

    git log -1 origin/$TAGNAME
    
        8
  •  10
  •   Daniel Little    11 年前

    为了获取标记引用的提交的sha/hash(而不是标记的sha):

    git rev-list -1 <tag>

        9
  •  7
  •   gahooa    15 年前

    我也想知道“正确”的方法,但同时,你可以这样做:

    git show mytag | head -1    
    
        10
  •  5
  •   Terrence Reilly    8 年前

    尽管这已经很旧了,但我想我会指出一个很酷的特性,我刚刚发现它可以列出带有提交的标签:

    git log --decorate=full
    

    它将显示提交时结束/开始的分支,以及提交的标记。

        11
  •  4
  •   Antony Hatchkins Alexander Hamilton    10 年前

    你也可以更容易地理解标签指向何处的图片

    git log --graph |git name-rev --stdin --tags |less
    

    然后滚动到您要通过查找的标签 / .

    更紧凑的视图( --pretty=oneline )加上所有的头( -a )也有助于:

    git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
    

    看起来有点可怕,但也可以化名为 ~/.gitconfig 如有必要。

    ~/.gitconfig
    
    [alias]
    ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
    
        12
  •  3
  •   Louis    8 年前

    这将为您提供当前的sha1哈希

    缩写的提交哈希

    git show <tag> --format="%h" --> 42e646e
    

    提交哈希

    git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280
    
        13
  •  2
  •   miku    15 年前

    我也想知道 正确的方法 ,但您可以随时查看:

    $ cat .git/packed-refs 
    

    或:

    $ cat .git/refs/tags/*
    
        14
  •  2
  •   Avy Sharell    8 年前

    如果您想查看标记sometag(标记器、日期等)的详细信息,它指向的提交哈希和一点关于提交的信息,但没有完整的diff,请尝试

    git show --name-status SOMETAG
    

    实例输出:

    tag SOMETAG
    Tagger: ....
    Date:   Thu Jan 26 17:40:53 2017 +0100
    
     .... tag message .......
    
    commit 9f00ce27c924c7e972e96be7392918b826a3fad9
    Author: .............
    Date:   Thu Jan 26 17:38:35 2017 +0100
    
     .... commit message .......
    
    ..... list of changed files with their change-status (like git log --name-status) .....
    
        15
  •  1
  •   Peter Stuifzand    15 年前

    这不会显示文件名,但至少您会对存储库有所了解。

    cat .git/refs/tags/*
    

    该目录中的每个文件都包含指向提交的提交sha。

        16
  •  1
  •   anatoly techtonik Tony    7 年前

    git mailing list ,以下是获取带有自动取消引用注释标记的标记的提交哈希列表的方法:

    git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags
    
        17
  •  0
  •   sibaz    7 年前

    所以我有一堆发布文件夹,这些文件夹可以从几个不同的repos中的一个中签出,可以是dev、qa或master分支,也可以是生产版本,从标签中签出,标签可以是注释的,也可以不是注释的。我有一个脚本,它将查看目标文件夹并返回表单-中的答案。问题是不同版本的git返回不同的状态'进行标记签出。

    所以我发现 git show-ref --tags 最初工作,除了带注释的标记。但是,添加-d在标记列表中添加了一个单独的条目,一个用于标记,另一个用于注释(注释提交被标识为^,我用sed删除了它)。

    所以这是我剧本的核心,对于任何想要它的人来说:

    REPO=`git --git-dir=${TARGET} remote show origin -n | \
             grep "Fetch URL:" | \
             sed -E "s/^.*\/(.*)$/\1/" | \
             sed "s/.git$//"`
    
    TAG=`git --git-dir=${TARGET} show-ref -d --tags | \
             grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
             cut -d\  -f2 | \
             cut -d/ -f3 | \
             sed "s/\^{}$//"`
    
    if [ "${TAG}" == "" ] ; then 
      BRANCH=`git --git-dir=${TARGET} show-ref --heads | \
             grep \`git --git-dir=${TARGET} show --quiet --format=format:%H HEAD\` | \
             cut -d\  -f2 | \
             cut -d/ -f3`
      TAG=${BRANCH}
    fi
    
        18
  •  0
  •   Reddysekhar Gaduputi    6 年前

    可以在下面使用,它将给出提交哈希
    git show -s --format=%H <tag>^{commit}

    如果需要缩写的提交哈希, git show -s --format=%h <tag>^{commit}

    推荐文章