在Git中获取最新标签的最简单方法是什么?

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

输出:

a
b
c

我应该写一个脚本来获得每个标记的日期时间并比较它们吗?


当前回答

这是一个老线程,但似乎很多人都忽略了OP问题最简单、最简单、最正确的答案:要获得当前分支的最新标记,您可以使用git describe HEAD。完成了。

编辑:您还可以提供任何有效的refname,甚至远程;也就是说,git describe origin/master会告诉你从origin/master可以到达的最新标签。

其他回答

git describe --abbrev=0 --tags

如果你没有看到latest标签,请确保在运行之前获取origin:

git remote update

这是一个老线程,但似乎很多人都忽略了OP问题最简单、最简单、最正确的答案:要获得当前分支的最新标记,您可以使用git describe HEAD。完成了。

编辑:您还可以提供任何有效的refname,甚至远程;也就是说,git describe origin/master会告诉你从origin/master可以到达的最新标签。

Git描述——标签

返回当前分支能看到的最后一个标记

如果您需要最后两个标记(例如,为了生成当前标记和前一个标记之间的更改日志),下面的工作对我来说是有效的。我只在最新标签是HEAD的情况下测试过它。

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

它适合我的需求,但因为我不是git巫师,我相信它可以进一步改进。我还怀疑如果提交历史向前移动,它会中断。我只是想说点有用的。

就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等为每个标签。这为您提供了HEAD上的提交数量,因为结束于v0.2的路径与HEAD后面的路径不同。

下面是一个Python脚本,它通过遍历所有运行该检查的标记来实现这一点,然后打印出在HEAD上提交最少的标记,因为标记路径发散了:

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

git描述做了一些稍微不同的事情,因为它从(例如)HEAD跟踪,以找到从HEAD返回的历史路径上的第一个标记。在git术语中,git描述了从HEAD“可到达”的标记的查找。因此,它不会找到像v0.2这样不在从HEAD返回的路径上的标记,而是从那里偏离的路径。