$ git tag -n1
v1.8 Tagged the day before yesterday
v1.9 Tagged yesterday
v2.0 Tagged today
$ git describe
v1.9-500-ga6a8c67
$
能否有人解释一下为什么"git describe"没有使用v2.0标签,以及如何修复它?已经推送了v2.0标签,所以我猜不能只是删除并重新添加它。
$ git tag -n1
v1.8 Tagged the day before yesterday
v1.9 Tagged yesterday
v2.0 Tagged today
$ git describe
v1.9-500-ga6a8c67
$
能否有人解释一下为什么"git describe"没有使用v2.0标签,以及如何修复它?已经推送了v2.0标签,所以我猜不能只是删除并重新添加它。
git describe
默认仅使用带注释的标签。指定--tags
选项可使其同时使用轻量级标签。
确保您已检出正确的提交(git rev-parse HEAD
)。使用git tag -a
创建带注释的标签。如果您运行git show <tagname>
,并且只看到了提交信息,则该标签是轻量级标签;如果您看到了其他标签消息,则是带注释的标签。
--all
命令来使用所有引用。HEAD 是否被标签所描述?(只是为了确认) - knittlgit rev-parse HEAD
)-还要确保您使用最新版本的git。注释标签是使用git tag -a
创建的。如果您执行git show <tagname>
并且看到提交,则为轻量级标签;如果您看到标签消息,则为注释标签。 - knittl我们遇到这种情况时,是由于对同一提交应用了两个标签。您可以通过运行以下命令来查找是否存在此情况:
# git log --oneline --decorate=short
deba4b4 (tag: v1.1.0.20.0, tag: v1.1.0.19.0) 001 New buildnumber
这里有两个标签,一个是版本19,另一个是版本20。版本20是在版本19之后打的标签,但是指向的是同一个提交。在这种情况下,描述返回了什么。
# git describe --tags
v1.1.0.19.0
我不知道为什么会这样,但这似乎是与重复标签一起使用的方式。
另一种可能出现这种情况的情况是,如果您在分支中有一个标签更加“接近”您的标签。该情况已在此博客文章中解释过。
问题在于 git tag
显示所有分支中的 所有标签,而 git describe
仅使用当前 分支 中可用的提交上的标签。
这里有一个例子(实际上我来这里的原因):
$ git tag | tail -n3
v0.4.0
v0.4.1
v0.4.2
显示最新的可用标签为v0.4.2
,但这是我的git describe
输出:
$ git describe --tags
v0.4.0-2-acd334c
我正在develop分支上。当我查看日志时,我确实发现最近的标签在当前分支上不可用:
$ git log --oneline --decorate=short | grep 'tag\:' | head -n3
acd334c (tag: v0.4.0) Merge pull request #1061
988fe5e (tag: v0.3.6) Merge pull request #859
5f97274 (tag: v0.3.5) Merge pull request #646
因此在我的情况下,开发人员决定创建一个新的发布分支专门用于标记发布版本,这导致开发分支与标签不再保持同步。
希望这可以帮助,感谢@eis提供通过检查日志来解决问题的想法。
v1.9
很可能是从合并提交中获取的标签。--first-parent
选项。git describe --tags --first-parent --abbrev=0
--first-parent
当看到合并提交时,仅跟踪第一个父提交。这在您希望不匹配已在目标提交历史中合并的分支上的标签时非常有用。