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

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

输出:

a
b
c

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


当前回答

所有的建议都有什么问题(除了Matthew Brett的解释,到目前为止)?

当你在不同的历史点时,只需运行其他jQuery Git历史上提供的任何命令,并使用可视化标签历史表示检查结果(我这样做就是为什么你看到这篇文章):

$ git log --graph --all --decorate --oneline --simplify-by-decoration

今天,许多项目在独立于主线的分支中执行发布(以及标记)。

这是有充分理由的。看看那些已经建立好的JS/CSS项目就知道了。出于用户约定,它们在DVCS中携带二进制/最小化的发布文件。当然,作为项目维护者,你不希望用无用的二进制blob来垃圾你的主线差异历史,并在主线之外执行构建工件的提交。

因为Git使用DAG而不是线性历史——很难定义距离度量,所以我们可以说——哦,那个rev最接近我的HEAD!

我开始了我自己的旅程(看看里面,我没有复制花哨的证明图片到这篇长文章中):

关于Git中的分支,过去最近的标记是什么?

目前我对标签与修订之间的距离有4个合理的定义,但有用性在降低:

从HEAD到合并base与tag的最短路径长度 HEAD和标签之间合并基础的日期 从HEAD可达但从tag不可达的转数 标签的日期,无论合并基础

我不知道如何计算最短路径的长度。

脚本,根据HEAD和标签之间的合并基础的日期排序标签:

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

它适用于大多数项目。

根据可从HEAD到达但无法从标签到达的转速数对标签进行排序的脚本:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

如果你的项目历史在提交时有奇怪的日期(因为重基或另一个历史重写或一些白痴忘记更换BIOS电池或其他你对历史所做的魔法),请使用上面的脚本。

对于最后一个选项(标签的日期,无论合并基础),以获得按日期排序的标签列表使用:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

要获得当前的修订日期,请使用:

$ git log --max-count=1

注意,git describe——tags在它自己的情况下有用途,但不是用于在项目历史中寻找人类期望的最近的标签。

注意:你可以在任何版本中使用上述食谱,只需将HEAD替换为你想要的!

其他回答

要获得最新的标签(后面的示例输出):

git describe --tags --abbrev=0   # 0.1.0-dev

要获得最近的标签,以及被标记对象顶部的额外提交数&更多:

git describe --tags              # 0.1.0-dev-93-g1416689

要获取最近的带注释的标签:

git describe --abbrev=0

在CI/CD进程中描述的问题是,您可能会遇到致命的问题:没有标签可以描述错误。

这将会发生,因为,per git describe——help:

该命令查找可从提交中访问的最新标记。

如果你想要repo中最新的标签,不管你所在的分支是否可以到达这个标签,通常是因为它不是当前分支树的一部分,这个命令会给你整个repo中最近创建的标签:

git tag -l --sort=-creatordate | head -n 1

Git描述——标签

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

如果你的标签是可排序的:

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1

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

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