识别一个标签属于Git的哪个分支

4
我先针对分支名为myBranch的清单执行了repo sync。然后我从中获取了标签。
git tag -l

现在我想知道如何使用git,以便了解通过git tag -l获得的每个标签实际上是在哪个分支上创建的。请注意:我不希望输出我的分支名(myBranch),而是希望输出标签被创建的远程分支名称。


4
这个问题的答案是否解决了你的疑惑?如何在Git中从标签名获取分支? - ttfreeman
4个回答

8
除了分支可以随时重命名或删除(而不会丢失任何提交,这些提交仍然可以在另一个分支的路径中引用),你能做的最好的事情是:
- 获取包含标签引用的提交的分支
请参见“Show the original branch for a commit”,结合“Git - how to tell which commit a tag points to”。(即使用 git rev-parse <tag>~0git branch --contains <sha1> 的组合)
这与创建标签的分支无关,而是与当前引用该标签的分支有关。

6
没有这样的事情。标签指向提交,分支也指向提交。一个提交可以被指向(或成为)几十个不同的分支的父提交;没有办法缩小到一个特定的分支作为“这个标签的所有者”。例如,在你获取之前,该分支可能已经从上游删除,只留下提交,这是为什么它不能工作的另一个例子。

4
一个单独的提交可以指向(或成为)数十个不同分支的父提交,这是一个好的观点。 - Joe.wang

1

我有两种方法解决了这个问题


使用@VonC提供的解决方案,我能够确定可用标签的源分支

for tag in $(git tag)
do
    commit=$(git rev-parse $tag~0)
    echo "$tag: $(git rev-parse $commit~0) | branch: $(git branch -r --contains $commit)" | grep branch
done

输出结果将类似于:
qa-test-integrated-v0.0.3d: 382d0553d189a8a1591667a3806ac98d0f11394a | branch:   origin/HEAD -> origin/master
qa-test-integrated-v0.0.3e: 1a5329d611fe15db6704fe1ea3717b62df8c4320 | branch:   origin/HEAD -> origin/master
tag-from-feature-branch: 851cb526e9f9e2c00a3b1e626c010038ecab7428 | branch:   origin/feature/DPTGROGU-0000-support

给定上面的片段,您可以使用任何bash工具来过滤与特定分支相关的内容。


  1. 如果您知道分支的名称并想知道哪些标签属于该分支,我们可以使用更高级的解决方案
git tag --merged branch

0

试试这个:

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

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