Git:如何查找标签所在的分支?

141

我目前忙于一个分支众多的项目,其中有一个标签记录了最后一次更改,但我不确定这个标签是在哪个分支上创建的。

如何查找标签所在的分支?

9个回答

175
更短的:

git branch --contains tags/<tag>

(它适用于任何树形参考)


如果您能找到标签所指向的提交

 git rev-parse --verify tags/<tag>^{commit}
 # or, shorter:
 git rev-parse tags/<tag>~0

然后,您可以找到包含该提交的分支

git branch --contains <commit>

user3356885所述,对于获取的分支(在远程名称空间中的分支)

commented以下内容:
git branch -a --contains tags/<tag>
git branch -a --contains <commit>

正如Pyr3z答案所指出的那样,对于上面列出的每个候选标签,您可以添加:

git log -1 --pretty='%D' TAG

那将显示与该标签相关联的分支。

7
在我使用的 Git 版本 1.7.1 上,我可以通过简单地运行 git branch --contains <tag> 来获取相关标签的分支信息。 - Dan Moulding
6
在这种情况下,寻找在远程分支上创建的标签将不会产生任何结果。换句话说,对于本地不存在的分支,将不会生成任何结果。应该使用选项*-a*。git branch -a --contains <tag>。对于提交也是同样的操作。 - user3356885
2
不幸的是,这会返回多个内容: *(HEAD分离于82dd3f0)主引用/标签/ 0.0.1-test-masterBr --> 我想以编程方式访问分支,而不是HEAD信息或标签本身。 - herm
1
git branch --contains <tag>。git版本为2.23.0,zsh,open SUSE tumbleweed。我认为这不仅适用于我的操作系统或shell,我认为这是现代git版本默认执行的操作。它们会在分页器中打开一个列表。 - redanimalwar
1
@tzg 是的,没有标签,我确实看到了分支...但整个想法是要获取标签所在的分支。 - undefined
显示剩余24条评论

53
如果 "git branch --contains" 命令没有任何输出,请确保包含所有分支,包括本地和远程分支。
git branch -a --contains <tag>

从git帮助中得知:

特定的git-branch操作: -a, --all 列出本地分支和远程跟踪分支


9

我对这里的顶级答案有异议——

——特别是像以下解决方案:

git branch -a --contains TAG

类似的问题在列出多个分支时存在问题,不清楚它实际上是哪个标签产生的。

$  git branch --contains TAG
   branch-A
   branch-B
 * branch-C
   branch-D

* 标记表示当前分支 = 不相关)

哦,而且使用 --sort=-committerdate=-taggerdate 进行排序并不能准确地显示原始分支,因为这些参考属性可能会被与所涉及的标签无关的操作更新。

git show TAG

确实给了我一个问题的真正答案(“这个标签是在哪个分支上创建的?”),但是默认情况下,git show 的格式相当臃肿,而我要寻找的是一种高效、机器友好的输出格式,以便传递给一些自动化脚本。

因此,结果证明,git log 是完成任务的核心命令:

git log -1 --format='%D' TAG

这将输出如下内容:
tag: TAG, origin/branch-B, branch-B

这告诉我们标签来源的确切分支,更便于机器阅读。


git log 不显示分支,我不确定为什么。 - Shmidt
@Shmidt 可能有各种原因导致这种情况... 当您运行纯git log时,是否会显示_任何_分支? - Pyr3z
有没有办法让git log的输出只显示"branch-B"? - undefined
@tzg 我想这个回答了你的问题吧?git log -1 --format='%D' TAG | grep -Eo '[^ ]+$' 不是百分之百确定,但在我的测试中有效,前提是你要找的分支名总是在最后列出。 - undefined

9
关于@VonC关于如何找到标签引用的提交的评论,只需使用以下命令:
git show <tag>

由于标签与特定提交相关联,因此可以使用它来显示该提交-这将为您提供完整的提交详细信息。


8
git branch --contains tag

对我来说没有用,但是我在 git gui 中找到了解决此问题的方法。

像这样启动:

git gui

在我的Ubuntu系统中,我需要使用sudo apt-get install git-gui先安装它。

然后我选择菜单项Repository -> Visualize All Branch History。在弹出的窗口中,我选择了菜单项File -> List References

另一个窗口弹出,列出了所有我的标签(和其他引用)。它们是可点击的,点击其中一个后,我只需要检查左下角的分支列表即可,如下所示:

Parent: somesha (message)
Parent: someothersha (another message)
Child:  anothersha (yet another message)
Branches: branch1, master, remotes/origin/branch2, remotes/upstream/branch1, etc
Follows: v1.1.2
Precedes: v1.1.4

3
你也可以尝试这个,我的使用情况类似,这对我有用。
git ls-remote --heads origin | grep $CI_COMMIT_SHORT_SHA  | sed "s/.*\///"

稍有不同,但受到@ttfreeman答案的启发


0

0

标签始终指的是提交编号。使用该标签编号,您可以使用以下方法找到放置该标签的分支:

git for-each-ref | grep ${commit_num} | grep origin | sed "s/.*\///"

-1

步骤1. 获取提交 ID:

git show {tag name}

步骤2. 复制提交ID并粘贴以获取所有分支:

By example:
git branch --contains 94a152c2d1c6830c5a044ecf20526d51e64bda83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接