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

Igo*_*aka 384 git git-tag

我在存储库中有一堆未注释的标记,我想知道它们指向哪个提交.是否有一个命令只列出标签及其提交SHA?检查标签并查看HEAD对我来说似乎有点过于费力.

更新

我在通过回复之后意识到,我真正想要的只是简单地看一下导致标签的历史,这就git log <tagname>足够了.

标记为答案的答案对于获取标签及其提交列表很有用,这就是我的要求.有一点shell hackery我敢肯定可以将它们转换为SHA + Commit消息.

mip*_*adi 317

一种方法是做到这一点git rev-list.以下将输出标记指向的提交:

$ git rev-list -n 1 $TAG
Run Code Online (Sandbox Code Playgroud)

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

[alias]
  tagcommit = rev-list -n 1
Run Code Online (Sandbox Code Playgroud)

然后调用它:

$ git tagcommit $TAG
Run Code Online (Sandbox Code Playgroud)

  • @ Jakub:`git rev-parse $ TAG`返回标记对象的SHA1,而不是它指向的提交.但是,`git rev-list -1`是有效的. (47认同)
  • 为什么不使用`git rev-parse <tag>`?或者`git rev-list -1 <tag>`? (29认同)
  • @mipadi:对于**未注释的**标签,它无关紧要; 对于带注释的标签,您可以使用`git rev-parse $ TAG ^ {commit}`或`git rev-parse $ TAG ^ {}`来取消引用带注释/签名的标签 (10认同)
  • 出于兴趣,这与`git show $ TAG'有什么不同? (5认同)
  • 您可以使用:`git rev-list $ TAG --max-count = 1` (4认同)
  • @RobinHsu:如果你有***注释的***标签,用`git tag -a`或`git tag -s`创建,那么`git rev-parse <tag>`会给你SHA-1一个*标签对象*本身,而`git rev-list -1 <tag>`会给它指向的*commit*(修订版)的SHA-1,与`git rev-parse <tag> ^ {commit}相同.HTH. (4认同)

CB *_*ley 223

git show-ref --tags
Run Code Online (Sandbox Code Playgroud)

例如,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
Run Code Online (Sandbox Code Playgroud)

  • 这将显示标记本身的引用,而不是标记指向的提交.您需要添加`-d`标志以获取引用的提交(在第二行). (33认同)
  • 这有效,虽然我想知道让`git tag --verbose`显示它们是不是有意义? (5认同)
  • 嗯.它在我的存储库中有奇怪的行为:git tag -a v0.1.1-alpha a9dcc1f24cacde535523bddc22f4c69467428550; git show-ref --tags - > b784145a9a71478337f5ceae30aaac4e1b955ee5 refs/tags/v0.1.1-alpha; 见Jakub Narebski的回答 (3认同)
  • @CharlesBailey,公平,但问题和答案已经变形,包括注释标签和'git show-ref`在两种不同类型的标签上表现不同的事实并不明显或常识. (3认同)

Hlu*_*ung 95

只是用 git show <tag>

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

  • 在SO上,当一个问题有许多不同的可能答案时,首先发布的答案首先会被提升 - 将它们放在列表的顶部,从而让它们在以后得到更多的赞成.这是基于响应速度的响应速度的偏置反馈回路.有足够的想象力可以解决这个问题. (7认同)
  • 什么是"最佳解决方案"?如果感兴趣的是找出提交的SHA,则标记指向"git show <mytag>"并不是最佳解决方案.此命令将显示提交引入的整个diff.仅列出提交的SHA,标记指向"git rev-list <mytag> -n 1"是正确的解决方案. (6认同)
  • @Hlung像@DolphinDream指出的那样,`git show`在屏幕上转储了更多不需要的东西.它模糊了正在寻找的实际提交哈希.如果你想要oneliner,更好的命令是`git log -1 [tag-name]`或`git log -1 --pretty = oneline [tag-name]`. (4认同)

ori*_*rip 39

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

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


Jak*_*ski 33

使用

git rev-parse --verify <tag>^{commit}
Run Code Online (Sandbox Code Playgroud)

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


git show-ref <tag>如果<tag>没有注释也会有用.总是有git for-each-ref(详见文档).

  • 我更喜欢`git rev-parse <tag> ~0`这似乎也有效,并且在Windows上不需要特殊的转义(需要四个帽子(^)而不是一个).后缀`〜<number>`给出<number>父提交,因此`~0`产生提交本身.顺便说一下,`^ 0`也是`^ {commit}`修订版后缀的有效简写. (11认同)

小智 33

来自Igor Zevaka:

摘要

由于大约有4个几乎同样可接受但又不同的答案,我将总结所有不同的方法来标记标签.

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

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

  3. git show-ref $TAG(回答)将显示标签及其路径以及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(答案)取决于标签是本地的还是从遥控器取出的.


Tuo*_* Le 15

这个怎么样:

git log -1 $TAGNAME
Run Code Online (Sandbox Code Playgroud)

要么

git log -1 origin/$TAGNAME
Run Code Online (Sandbox Code Playgroud)


Dan*_*tle 10

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

git rev-list -1 <tag>


Jes*_*sen 10

Git-2 后的简短回答

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

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

git tag --list --format '%(refname:short) %(objectname:short)'
Run Code Online (Sandbox Code Playgroud)

简单的。短的。

PS别名它git taglist与此命令一样:

git config --global alias.taglist "tag --list --format '%(refname:short) %(objectname:short)'"
Run Code Online (Sandbox Code Playgroud)

  • 对于带注释的标签,这给出了标签哈希而不是提交哈希。 (2认同)

Nat*_*han 10

--format选项可用于显示标签哈希和提交哈希,并区分轻量级标签和带注释的标签。

git tag --format="%(color:bold cyan)== %(refname:short) ==%(if)%(object)%(then)%0aTag Hash: %(objectname)%0aTag Date: %(taggerdate:iso-local)%0a  Commit: %(object) %0a%0a%(contents)%(else)%0a(lightweight tag)%0a  Commit: %(objectname)%(end)%0a"
Run Code Online (Sandbox Code Playgroud)

给出类似于以下内容的输出:

== b2lightweight ==
(lightweight tag)
  Commit: 0450fae4352dbbbf088419757eda32711316a02e

== c3_annotated ==
Tag Hash: 19961d8678a09a319a9d6c398c79f27cc23d610c
Tag Date: 2021-08-06 15:18:48 -0600
  Commit: 85be6e80c109ce44d78f0ca0da8e1ec53817b24c

This is my tag message.

It has multiple lines.

Another line.
Run Code Online (Sandbox Code Playgroud)

要定义为 git 别名,您可以编辑全局 git 配置并git config --global -e添加以下内容:

[alias]
    tag-verbose = tag --format='%(color:bold cyan)== %(refname:short) ==%(if)%(object)%(then)%0aTag Hash: %(objectname)%0aTag Date: %(taggerdate:iso-local)%0a  Commit: %(object) %0a%0a%(contents)%(else)%0a(lightweight tag)%0a  Commit: %(objectname)%(end)%0a'
Run Code Online (Sandbox Code Playgroud)

别名仍然允许过滤,例如

C:\playground>git tag-verbose -l *b2*
== b2lightweight ==
(lightweight tag)
  Commit: 0450fae4352dbbbf088419757eda32711316a02e
Run Code Online (Sandbox Code Playgroud)

有关--format选项的更多信息,请参阅下面的“字段名称”部分git help for-each-ref。(git help tag声明“格式与 git-for-each-ref 的格式相同”)


gah*_*ooa 8

我也想知道"正确"的方式,但与此同时,你可以这样做:

git show mytag | head -1    
Run Code Online (Sandbox Code Playgroud)


小智 7

即使这已经很老了,我想我会指出一个很酷的功能,我刚刚找到列出标签的提交:

git log --decorate=full
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*ins 5

您还可以获得更易于解释的标签指向使用位置的图片

git log --graph |git name-rev --stdin --tags |less
Run Code Online (Sandbox Code Playgroud)

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

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

git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Run Code Online (Sandbox Code Playgroud)

看起来有点吓人,但也可以在~/.gitconfig必要时使用别名。

~/.gitconfig

[alias]
ls-tags = !git log -a --pretty=oneline --graph |git name-rev --stdin --tags |less
Run Code Online (Sandbox Code Playgroud)