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

时间:2009-12-07 19:45:17

标签: git git-tag

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

更新

我在完成回复之后意识到,我真正想要的只是查看导致标记的历史记录,git log <tagname>就足够了。

标记为答案的答案对于获取标签列表及其提交非常有用,这就是我的要求。有了一些shell hackery,我确信可以将它们转换为SHA + Commit消息。

20 个答案:

答案 0 :(得分:292)

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

$ git rev-list -n 1 $TAG

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

[alias]
  tagcommit = rev-list -n 1

然后用:

来调用它
$ git tagcommit $TAG

答案 1 :(得分:214)

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

答案 2 :(得分:93)

只需使用git show <tag>

即可

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

答案 3 :(得分:34)

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

另外,

git show-ref --dereference TAG显示了指向的提交。

答案 4 :(得分:32)

使用

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

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


如果git show-ref <tag>没有注释,

<tag>也会有效。并且始终有git for-each-ref(有关详细信息,请参阅文档)。

答案 5 :(得分:32)

来自Igor Zevaka

摘要

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

  1. git rev-list -1 $TAGanswer)。 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-refsanswer),具体取决于代码是本地代码还是从远程提取。

答案 6 :(得分:15)

这个怎么样:

git log -1 $TAGNAME

OR

git log -1 origin/$TAGNAME

答案 7 :(得分:10)

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

git rev-list -1 <tag>

答案 8 :(得分:9)

Git-2后简短答案

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

我更喜欢这一点,因为它使用了git tag

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

简单。简短。

使用以下命令将其别名为git taglist

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

答案 9 :(得分:7)

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

git show mytag | head -1    

答案 10 :(得分:6)

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

git log --decorate=full

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

答案 11 :(得分: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

答案 12 :(得分:3)

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

缩写提交哈希

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

提交哈希

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

答案 13 :(得分:2)

我也想知道正确的方式,但你总是可以偷看:

$ cat .git/packed-refs 

或:

$ cat .git/refs/tags/*

答案 14 :(得分: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) .....

答案 15 :(得分:1)

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

'FE' => [
   'pageNotFound_handling' => 'error-404' // Set your error page
],

答案 16 :(得分:1)

这不显示文件名,但至少你会感觉到存储库。

cat .git/refs/tags/*

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

答案 17 :(得分:0)

所以我有一大堆发布文件夹,其中这些文件夹可以从几个不同的存储库中检出,可能是dev,qa或master分支,也可能是生产版本,从标签检出,以及标签可以注释或不注释。我有一个脚本,它将查看目标文件夹并返回表单中的答案 - 。问题是不同版本的git返回不同的状态&#39;用于标签结帐。

所以我发现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)

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

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

答案 19 :(得分:0)

--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"

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

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

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

[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'

别名仍然允许过滤,例如

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

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