显示您在哪个git标签上?


216

我无法找出当前已签出的标签。

当我做:

git checkout tag1
git branch

我似乎找不到我在哪个标签上。它仅记录:

* (no branch)
master

是否可以找出签出的标签?在上面的示例中,该值为tag1

Answers:


326

编辑:JakubNarębski有更多的git-fu。以下简单得多的命令可以完美运行:

git describe --tags

(或者--tags如果没有签出带注释的标签,则不带。我的标签是轻型的,所以我需要--tags。)

原始答案如下:

git describe --exact-match --tags $(git log -n1 --pretty='%h')

git-fu更多的人可能会有更优雅的解决方案...

这利用了git-log从您检出的内容开始报告日志这一事实。%h打印缩写的哈希。然后git describe --exact-match --tags找到与提交完全匹配的标签(轻量或带注释)。

$()上面的语法假定您正在使用bash或类似的东西。


22
git describe如果您正好位于(带注释)标记上,<tag>-<n>-g<shortened sha-1>则仅使用会显示标记名称,否则,<n>则显示<tag>
JakubNarębski2010年

1
@Jakub-谢谢。我--exact-match在您发表评论的几秒钟前就添加了答案。很高兴知道您可以删除它,并且仍然可以从模糊的输入中获得良好的信息。
bstpierre

谢谢,这正是我想要的。顺便说一句,甚至连git-describe --exact-match(没有--tags)都对我有用。
grm

3
使用... git rev-parse HEAD是比git log -n1 --pretty='%h'... 更好的解决方案,但是为什么您不能简单地编写HEAD(或者什么也不做,git describe默认为HEAD)?
JakubNarębski10年

只有Guybrush讨厌瓷器
vdegenne

70

这对我有用 git describe --tags --abbrev=0


2
是。即使您不完全在该标签上,此方法也有效!:)
Martin Muzatk​​o '17

13
嗯 ...如果您在标签后三次提交时检出哈希,则您不在“该标签上”。它告诉您签出之前或之后的最后一个标签。因此,这是不正确的。
ingyhere

也可以在Windows上使用:)
Cowlinator

49

显示当前HEAD上的所有标签(或提交)

git tag --points-at HEAD

1
请注意,即使结果为空,此命令也不会在命令行中报告错误。虫子?如果该位置有多个标签,它也会返回一个列表。这是最好的答案,但脚本编写者应谨慎考虑这些警告。
ingyhere

以下@ingyhere的评论。是的,这是一个很好的信息,没有错误,因此人们需要相应地处理结果。但我不会将其称为错误。就我而言,“如果没有标签则为空”有效。在其他情况下,有人可以将其保存到变量中,然后检查其是否为空(链接到bash指令)
–driftcatcher

23

git describe瓷器命令,应避免:

http://git-blame.blogspot.com/2013/06/checking-current-branch-programatically.html

相反,我使用了:

git name-rev --tags --name-only $(git rev-parse HEAD)

11
它返回“未定义”
陌生人2015年

4
这将输出^0与标记相对应的提交的尾随(例如,对于1.0其输出的标记1.0^0)。有什么办法只能让Git输出1.0,还是应该为此使用sed?
Daniel Serodio

13
只是一些概念上的挑剔:我认为您颠倒了瓷器和管道的含义。可以使用瓷器,它的含量高,可以正常使用。管道内部(顾名思义),不建议这样做,因为git开发人员保留更改其参数和输出而无警告的权利。因此,您的第一个建议实际上是稍微合适一点的建议。
Leo Antunes

5
链接的文章说避免使用“ git branch”,因为它不适用于该用例。我想不出任何避免使用git describe的充分理由。如Leo所说,“瓷器”命令是通常应该使用的命令。除非您真的知道自己在做什么,否则请避免执行管道命令。“ git describe”效果很好。
Danny

4
“瓷器”命令是您应该使用的命令,而不是应避免使用的命令。它们是其输出是机器可读的命令,并且在以后的版本中不会更改,因此可以在脚本等中依赖。非瓷质命令往往会产生更多人类可读的输出,但是在将来的版本中可能会发生更改,例如,使输出更多易读,不是因为重要的事情实际上已经改变。
rjmunro

22

签出标签时,您拥有所谓的“分离头”。通常,Git的HEAD提交是指向您当前已签出的分支的指针。但是,如果您检出的不是本地分支(例如,标记或远程分支),则您的头会“分离”-您实际上不在任何分支上。当您头顶分离时,请勿进行任何提交。

如果您不想进行任何编辑,可以签出标签。如果您只是检查文件的内容,或者想通过标签构建项目,则只要您不进行任何提交,就可以git checkout my_tag使用文件并使用它们。如果要开始修改文件,则应基于标记创建一个分支:

$ git checkout -b my_tag_branch my_tag

将创建一个名为新的分支my_tag_branch从开始my_tag。在此分支上提交更改是安全的。


1
很棒的答案。
Panos Filianos

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.