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


410

我在存储库中有一堆未注释的标签,我想弄清楚它们指向哪个提交。是否有只列出标签及其提交SHA的命令?签出标签并看着HEAD对我来说似乎有点费力。

更新资料

在回答之后,我意识到我真正想要的只是简单地查看导致该标签的历史,这git log <tagname>已经足够了。

标记为答案的答案对于获取标记及其提交的列表很有用,这正是我所要求的。有了一些Shell骇客,我相信可以将其转换为SHA + Commit消息。


3
我想指出的是git show-ref显示标签的内容,而不是仓库版本的内容。$ git show-ref test 08b9c774ab20e5bdb638638cf4ea2c124b0dae54 refs / tags / test $ git checkout test HEAD现在位于c7f8831 ... $ git checkout 08b9c77 HEAD现在位于c7f8831 ...
Konstantin Pelepelin 2014年

如果您的标签带有注释,那么您需要--dereference
Trevor Boyd Smith,

Answers:


347

一种方法是使用git rev-list。以下将输出标记指向的提交:

$ git rev-list -n 1 $TAG

~/.gitconfig如果经常使用,可以将其添加为别名:

[alias]
  tagcommit = rev-list -n 1

然后调用:

$ git tagcommit $TAG

30
为什么不使用git rev-parse <tag>?还是git rev-list -1 <tag>
JakubNarębski09年

51
@ Jakub:git rev-parse $TAG返回标记对象的SHA1,而不是其指向的提交。git rev-list -1虽然有效。
mipadi

11
@mipadi:对于未注释的标签,没关系;您可以使用带注释的标签git rev-parse $TAG^{commit}git rev-parse $TAG^{}取消引用带注释/签名的标签
JakubNarębski09年

5
您可以使用:git rev-list $TAG --max-count=1
b73 2014年

4
@RobinHsu:如果你有注释标签,这与创建git tag -agit tag -s,然后git rev-parse <tag>会给你一个的SHA-1 标签的对象本身,而git rev-list -1 <tag>会给SHA-1的提交(修订)它指向,一样的git rev-parse <tag>^{commit}。HTH。
JakubNarębski16年

240
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

为此,这实际上隐藏了看“ .git/packed-refs或” 的语义.git/refs/tags/*
Igor Zevaka

3
嗯。它在我的存储库中有奇怪的行为:git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags-> b784145a9a71478337f5ceae30aaac4e1b955ee5 refs / tags / v0.1.1-alpha; 看到雅库布·纳雷斯基(Jakub Narebski)的答案
NickSoft

6
这行得通,尽管我不知道也向他们git tag --verbose展示也有意义吗?
极性

34
这将显示标签本身的引用,而不是标签所指向的提交。您需要添加-d标志以获取引用的提交(在第二行)。
老专业

4
@CharlesBailey,很公平,但是问题和答案已经变形为包含带注释的标签,并且git show-ref在两种不同类型的标签上行为不同的事实并不明显,也不是常识。
旧专业版

104

只需使用 git show <tag>

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


7
在SO上,当一个问题有许多不同的可能答案时,首先发布的答案将被首先投票-将它们放在列表的顶部,从而使他们在以后被更多投票。这是一个基于响应速度超过响应质量的偏置反馈环路。只要有足够的想象力,这个问题就可以解决。
samthebest,2015年

6
“最佳解决方案”是为了什么?如果感兴趣的是找出提交的SHA,则标记指向“ git show <mytag>”不是最佳解决方案。该命令将显示提交引入的整个差异。对于列出仅提交的SHA,标记指向“ git rev-list <mytag> -n 1”是正确的解决方案。
DolphinDream,2015年

这不是OP问题的答案。git show <tag>显示差异,而不是标签指向的提交。
demisx '16

@demisx您在说什么?它肯定会显示提交哈希,以及标记器,日期和其他信息。尝试一下。
Hlung

4
@Hlung就像@DolphinDream指出的那样,git show在屏幕上转储了很多不需要的东西。它掩盖了正在寻找的实际提交哈希。一个更好的命令是git log -1 [tag-name]或者git log -1 --pretty=oneline [tag-name]如果您想要一个班轮。
demisx '16

40

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

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


34

伊戈尔·泽瓦卡Igor Zevaka)

摘要

由于大约有4个几乎可以接受但又不同的答案,因此我将总结所有不同的标记皮肤的方法。

  1. git rev-list -1 $TAG回答)。git rev-list输出导致$TAG类似于git log但仅显示提交的SHA1的提交。将-1输出限制为其指向的提交。

  2. git show-ref --tagsanswer)将显示所有标记(本地标记和从远程获取的标记)及其SHA1。

  3. git show-ref $TAGanswer)将显示标签及其路径以及SHA1。

  4. git rev-parse $TAGanswer)将显示未注释标签的SHA1。

  5. git rev-parse --verify $TAG^{commit}answer)将显示带注释和未带注释标签的SHA1。在Windows上使用git rev-parse --verify %TAG%^^^^{commit}(四顶帽子)。

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


33

采用

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

(即使对于带注释的标记,它也会返回提交的SHA-1)。


git show-ref <tag>如果<tag>未注释,也将起作用。并且总是存在git for-each-ref(有关详细信息,请参阅文档)。


11
我更喜欢git rev-parse <tag>~0这种方法似乎也可以工作,并且不需要在Windows上进行特殊的转义(在这种情况下,需要四顶帽子(^)代替一顶)。后缀~<number>给出了第<number>个父提交,因此~0产生了提交本身。顺便说一句,^0也是^{commit}修订后缀的有效简写。
Attila 2012年

15

这个怎么样:

git log -1 $TAGNAME

要么

git log -1 origin/$TAGNAME


8

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

git show mytag | head -1    

具有提交标题git show --oneline mytag | head -1
Stphane '16

7

即使这已经很老了,我还是想指出一个我刚刚发现的很不错的功能,用于列出带有提交的标签:

git log --decorate=full

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


4

您还可以获得标签易于使用的更易理解的图片

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

4

Git-2简短回答

我知道这个问题已经存在了很长时间。CB Bailey的答案是100%正确的:git show-ref --tags --abbrev

我更喜欢这个,因为它使用git tag

git tag --list --format '%(refname:short) %(objectname:short)'

简单。短。

PS git taglist使用以下命令对其进行别名:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"

3

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

git for-each-ref --format='%(if)%(*objectname)%(then)%(*objectname)%(else)%(objectname)%(end) %(refname)' refs/tags

2

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

cat .git/refs/tags/*

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


我认为这是行不通的,因为我是从远端拉出标签的。.git/packed-refs确实有工作。
Igor Zevaka 09年

2

我也想知道正确的方法,但是您始终可以窥视以下任何一种方法:

$ cat .git/packed-refs 

要么:

$ cat .git/refs/tags/*

正确,所以packed-refs和refs / tags的行为有些不同,packed-refs是一个包含标签和SHA的文本文件,而refs / tags /是一个目录,其中文本文件以包含SHA的标签命名。我实际上认为正确的方法是使用git rev-list
Igor Zevaka 09年

2

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

缩写提交哈希

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

提交哈希

git show <tag> --format="%H" --> 42e646ea3483e156c58cf68925545fffaf4fb280

1
似乎在我使用的版本中git log <tag> -n 1 --pretty=%H不起作用,但是可以
Andy

2

如果您想查看标签SOMETAG的详细信息(标记,日期等),它指向的提交的哈希值以及有关该提交的一些信息,但是没有完整的差异,请尝试

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) .....

0

因此,我有大量的发布文件夹,其中这些文件夹可以从几个不同的存储库之一中检出,并且可以是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

0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.