如何在Git的当前分支中获取最新的标签名称?

690

如何在Git中获取最近的标签?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

输出:

a
b
c

我应该编写一个脚本来获取每个标签的日期时间并进行比较吗?


4
最新创建的标签还是按提交日期排序的最新标签?你接受的答案展示了最新创建的标签。如果有人决定更改现有的标签,这可能会成为问题... - Paebbels
25个回答

955
获取最新的标签(示例输出如下):
git describe --tags --abbrev=0   # 0.1.0-dev

要获取最新的标签,以及标记对象之上的附加提交数量等更多信息:

git describe --tags              # 0.1.0-dev-93-g1416689
为了获得最近的“带注释”的标签:
git describe --abbrev=0

5
正如 git describe 的 man 手册所述: --abbrev=<n> [...] 当 <n> 设置为 0 时,将不显示长格式,仅显示最近的标签。 - Giorgos Kylafas
11
如果您有两个标签指向相同的提交,那么这个答案(以及可能的其他答案)会遇到问题。除非这些标签是带注释的标签,否则我认为Git无法区分哪一个标签是先创建的。 - Paul Lynch
4
如果我有超过两个标签,那么这些标签并不会全部打印出来。 - Sungguk Lim
9
如果您想直接检出最新的标签:git checkout $(git describe --abbrev=0 --tags) - JohnRDOrazio
5
这个回答比当前的“被采纳”的答案更好,因为它提供了精确的命令行使用方法,而不仅仅是“查看文档”。 - Ezh
显示剩余7条评论

517

将输出所有分支中最新的已标记提交的标记。

git describe --tags $(git rev-list --tags --max-count=1)

31
这是最佳答案。实际上它可以跨越所有分支获取标签,而不仅仅是像当前“正确”的答案一样只能在当前分支获取。 - brittohalloran
5
@michaeltwofish,当时我不知道,后来想通了并纠正了我的回答。对此感到抱歉。 - kilianc
9
注意:即使该标签在另一个分支上,此命令也会返回“最新”的标签。 - Alan Zhiliang Feng
4
我不同意这个观点,即问题只涉及到特定的分支。虽然问题的标题暗示了这一点,但实际上所提出的问题是:“在Git中获取最新标签的最简单方法是什么?”我猜这是一个元问题,即标题本身是否就是问题。 - William Pursell
1
我相信没有人想获取当前分支的最新标签。因为标签在所有分支中都是唯一的,仅获取一个分支的标签就没有任何意义或帮助。这个答案应该被标记为接受的答案。 - emeraldhieu
显示剩余4条评论

505
你可以查看git describe,它可以实现类似于你所要求的功能。

242
使用 --abbrev=0 选项应返回最接近的带标注的标签。 - Jakub Narębski
23
返回当前分支中最新的标签。 - brittohalloran
52
要获取当前分支中仅针对当前提交的最新带注释标签,可以使用命令 git describe --exact-match --abbrev=0 - Naftuli Kay
8
这篇答案带有评论,但未提供我所需的正确标签。@kilianic 给出了正确的解决方案。 - Herman J. Radtke III
32
git describe --tags 并比较 GitHub 发布页面上的最新标签。 - Adriano Resende
显示剩余5条评论

61
为了获取最新的标签,您可以执行以下操作:
$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1
当然,您可以根据需要更改计数参数或排序字段。看起来您可能想问一个略微不同的问题,但是这个答案符合我的理解。

3
这几乎正是我要找的(跨所有分支中最近的标签),但至少在我使用的 git 版本(1.7.7.6)中,--sort=-authordate--sort=authordate 产生的标签顺序相同。 - larsks
4
啊哈,因为您实际想要的是 --sort=-taggerdate。对于标签来说,authordatecommitterdate 是空的(因此不适用作排序键)。 - larsks
13
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1 这条命令甚至更好 :) - Christophe Eblé
1
请注意,它返回的是标记时间上最“新”的标记,可能不是树中最“近期”的标记。例如,您可以检出任何先前的提交并标记该提交。 “最新”的标记将是最新创建的标记。 - Randy Lai
1
--points-at=$SHA 将为您提供提交哈希的标签。 - Ryan
显示剩余6条评论

48

这个怎么样?

TAG=$(git describe $(git rev-list --tags --max-count=1))

从技术上讲,它不一定会获取到最新的标签,而是最新的被打了标签的提交,这可能不是你正在寻找的东西。


1
这个不仅适用于当前分支的最新标签,而且适用于任何分支。这非常好,因为这正是我所需要的。谢谢Wincent。 - jasongregori
4
如果您需要获取标签匹配模式,可以在rev-list中使用--tags=<pattern>。例如,获取最后一个版本的标签git describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1) - Wirone
2
$(git describe --contains $(git rev-parse HEAD)): - Vaidas Zilionis
谢谢,它起作用了,但是我必须添加--tagsgit describe --tags $(git rev-list --tags --max-count = 1) - Gianluca Casati

35
在CI/CD流程中,使用describe可能会遇到fatal: no tags can describe错误。
这个问题的原因是根据git describe --help的解释:

该命令找到从某个提交可达的最近的标签。

如果你想要获取仓库中最新的标签,而不管你所在的分支是否能够到达该标签,通常是因为它不属于当前分支的树,那么这个命令将给出整个仓库中最近创建的标签。
git tag -l --sort=-creatordate | head -n 1

更多细节和其他可排序的键可以在这里找到:https://git-scm.com/docs/git-for-each-ref#_field_names

这个名称在我的情况下似乎不起作用。使用git版本2.37.2.windows.2上的powershell进行操作。我通过将排序从--sort=-creatordate更改为--sort=creatordate来验证了这一点,但仍然得到了相同的结果顺序。 - Anders Larsen
我目前在使用OSX,使用的是git 2.15.x版本,当我发布这篇文章时可能是旧版本。 - Shanerk
不确定creatordate是什么意思,但对我来说committerdate也可以:git tag -l --sort=-committerdate | head -n1 - pawamoy
对于提交和标签对象,特殊的creatordate和creator字段将与提交者或标签者字段中适当的日期或姓名-电子邮件-日期元组相对应,具体取决于对象类型。这些字段旨在用于处理注释和轻量级标签的混合情况。https://git-scm.com/docs/git-for-each-ref#_field_names - Shanerk
对于提交和标签对象,特殊的creatordate和creator字段将与提交者或标签者字段中的适当日期或姓名-电子邮件-日期元组相对应,具体取决于对象类型。这些字段用于处理注释和轻量级标签的混合情况。请参考https://git-scm.com/docs/git-for-each-ref#_field_names。 - undefined

34

我从排名最高/被接受的答案开始,一步步往下进行。这是第一个给出最新标签的答案(不确定为什么,但是普通的 git describe ... 返回了一个早期的标签?!)。 - Jeremy Davis
这是唯一适用于我的方法。尝试了一些 --abbrev=0 的答案,但它们截断了我想要的标签的一部分。 - Luke Davis

33
git describe --abbrev=0 --tags

如果您没有看到最新的标签,请确保在运行此命令之前已经拉取了远程代码库:

git remote update

1
谢谢,按照其他答案建议简单地执行 git describe --abbrev=0 返回的是 v1.0.0,而不是最新的本地标签,添加 --tags 则可以得到正确的标签。 - Herz3h

31

我不确定为什么没有回答问题所询问的内容,即所有标签(包括未注释的标签)且不带后缀:

git describe --tags --abbrev=0

28

关于 git,"最近的" 可以有两种含义。

你可能指的是 "哪个标签的创建日期最晚",这里大部分答案都是针对这个问题的。根据你的问题,你需要返回标签 c

或者你可能指的是 "哪个标签在开发历史中与某个命名分支最接近",通常是你正在使用的分支 HEAD。在你的问题中,这将返回标签 a

当然,这两个意思可能是不同的:

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

假设开发人员在星期一将Z标记为v0.2,然后在星期二将 Q标记为v0.1。 尽管v0.1是更近的版本,但从开发历史角度来看,v0.2更接近HEAD,因为它所在的路径起点更接近HEAD.

通常情况下您可能希望选择第二个答案,即与开发历史更接近的版本。 您可以通过使用git log v0.2..HEAD等命令查找此信息。 对于每个标签,这会告诉您自v0.2路径分离以来HEAD上有多少个提交。

以下是一个Python脚本,通过迭代运行此检查并打印出最少提交的标签:

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describe执行略有不同的操作,它从(例如)HEAD开始向后跟踪,以查找位于HEAD历史路径上的第一个标签。 在git术语中,git describe查找可由HEAD到达的标签。 因此,它将无法找到像v0.2这样不在HEAD路径上的标签,但是在那里分支的路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接