显示你在哪个git标签上?

我找不到当前签出的标签。

当我这样做的时候:

git checkout tag1
git branch

我好像找不出我在哪个标签上。它只记录:

* (no branch)
master

是否有可能找出哪些标签被签出?在上面的例子中,这将是tag1

214231 次浏览

当你签出一个标签时,你有一个所谓的“分离”。通常,Git的HEAD提交是一个指向当前签出的分支的指针。但是,如果签出本地分支以外的内容(例如,标记或远程分支),则有一个“分离头”——您实际上不在任何分支上。你不应该在一个独立的头部上做任何提交。

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

$ git checkout -b my_tag_branch my_tag

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

编辑

Jakub Narębski有更多的git-fu。下面这个简单得多的命令可以很好地工作:

git describe --tags

(如果签出了带注释的标记,则不带--tags。我的标签是轻量级的,所以我需要--tags。)

原来的答案

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

更有天赋的人可能会有更优雅的解决方案……

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

上面的$()语法假设你使用的是bash或类似的。

git describe是一个< em >瓷< / em >命令,你应该避免:

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

相反,我使用:

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

git log --decorate

这将告诉你哪些引用指向当前签出的提交。

这为我工作git describe --tags --abbrev=0

编辑2020:正如下面的一些评论所提到的,这可能对你有用,也可能没用,所以要小心!

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

git tag --points-at HEAD

下面是一组特定用例的有趣示例。如果你的存储库有诸如v1.0.0v1.1.0v1.1.1等版本,以及诸如v1这样指向最新v1.x.x的简写版本,下面的代码将为你提供当前签出的提交与最新完整版本标记的关系的引用,如果这不起作用,则提供回退:

git describe --tags --exact-match --match "v*.*.*" \
|| git describe --match "v*.*.*" --tags \
|| git describe --tags \
|| git rev-parse HEAD

假设你有以下提交:

* 4444444 (main, origin/main, tag: v2.0.0, tag: v2.0, tag: v2)
* 3333333
* 2222222 (tag: v1.1.0, tag: v1.1, tag: v1)
* 1111111 (tag: v1.0.0, tag: v1.0)
* 0000000

上面的命令输出的几个例子:

  • git checkout mainv2.0.0
  • git checkout 3333333v1.1.0-1-g3333333
  • git checkout 2222222v1.1.0
  • git checkout v1v1.1.0
  • git checkout 00000000000000(完整引用)