如何在当前提交中获取标记

Sha*_*awn 54 git

我有一个存储库,在同一个提交中有多个标记.例如:

commit #3 <--- TAG1 / TAG2 / TAG3

  |

commit #2 <--- TAG4/ TAG5

  |

commit #1 <--- TAG6/ TAG7
Run Code Online (Sandbox Code Playgroud)

我想找出特定提交中的标记.例如,如果我检查提交1,我想获得标记6和标记7.

我试过了:

git checkout <commit 1> 
git tag --contains
Run Code Online (Sandbox Code Playgroud)

显示标签1-7.

git checkout <commit 1>
git describe --tags HEAD
Run Code Online (Sandbox Code Playgroud)

仅显示标签6.

在Git中这样做的正确方法是什么?

小智 109

为了完成(感谢Ciro Santili的回答),git-tag有了选项 - points-at就像Shawn所要求的那样.

git tag -l --points-at HEAD
Run Code Online (Sandbox Code Playgroud)

正如Jonathan Hartley在他对git-tag --contains的评论中所说的那样,它也无法列出正向提交的标签.

  • 来自`git help tag`:`--points-at &lt;object&gt; –仅列出给定对象的标签(如果未指定,则为HEAD)。暗示--list。因此,可以省略-l和HEAD。 (6认同)

arc*_*mac 23

我想也许git已经添加了一些选项,因为这个问题被问到了,但是因为它在谷歌上仍然相当高,我想我会补充说这种方式很好用:

git tag -l --contains HEAD
Run Code Online (Sandbox Code Playgroud)

或者替换HEAD为您喜欢的任何其他有效提交引用.

如果HEAD包含任何标记,这将打印换行符分隔的新行,并且不打印任何标记,因此您将获得:

TAG6
TAG7
Run Code Online (Sandbox Code Playgroud)

当然,有很多很好的方法可以使用各种其他shell工具,一旦你拥有它就可以格式化输出...

  • 这给出了错误的输出.它显示了"包含"给定提交的所有标记,即还包括应用于先前可达提交的标记.原始问题明确表示他不想要这些旧标签,只需要给定提交中的"当前"标签. (7认同)

Jos*_*Lee 18

威廉回答的一些改进:

git config --global alias.tags 'log -n1 --pretty=format:%h%d'
Run Code Online (Sandbox Code Playgroud)

输出如下所示:

~$ git tags
7e5eb8f (HEAD, origin/next, origin/master, origin/HEAD, master)
~$ git tags HEAD~6
e923eae (tag: v1.7.0)
Run Code Online (Sandbox Code Playgroud)


qoo*_*mon 7

git tag --points-at

--指向

仅列出给定对象的标签(如果未指定,则为 HEAD)。暗示--list。

来自https://git-scm.com/docs/git-tag


Wil*_*ell 6

这并不理想,但可能有帮助:

$ git log -n 1 --decorate --pretty=oneline

您可以使用格式来获​​得您想要的内容。


web*_*mat 5

这将显示 HEAD 的提交 ID,以及恰好位于 HEAD 的任何分支或任何标签。

git reflog --decorate -1
Run Code Online (Sandbox Code Playgroud)

示例输出:

484c27b (HEAD, tag: deployment-2014-07-30-2359, master, origin/master) HEAD@{0}: 484c27b878ca5ab45185267f4a6b56f8f8d39892: updating HEAD
Run Code Online (Sandbox Code Playgroud)