git 如何显示分支无法访问的所有标记提交?

bqjvbblv  于 2023-05-05  发布在  Git
关注(0)|答案(2)|浏览(230)

在我的本地存储库中,有时候会有标记一个提交,没有子级和分支名称。
我最初通过通常从我的主开发线分支,设置一个标记,然后删除分支来创建这些代码。他们不会被垃圾收集,因为标签保持线路畅通。
是否有一个命令可以识别所有这样的提交?这个命令是否也能找到分支头并不重要,因为我可以用git show-ref --heads很容易地识别它们。
我想把它们清理一下(或者删除标签,然后对我不再需要的行进行GC;或者在那里设置一个分支,我认为这是更好的做法)。

kyks70gy

kyks70gy1#

使用git tag列出所有标记。测试它们是否可以从一个或多个分支访问。
类似于:

git tag | while read tag
do
    echo Tag is $tag
    git branch -a --contains $tag
    echo ""
done
mwkjh3gx

mwkjh3gx2#

TL、DR

bash或类似

$ git tag $(git branch --all --list --format="--no-merged %(refname:short) ")

说明

git tag--no-merged [<commit>]选项显示所有无法从给定提交到达的标记(默认为head)。最妙的是可以多次使用--no-merged
假设你有这样的情况:

$ git log --oneline --all --graph
* 075bf49 (tag: TagNotOnAnyBranch) some commit
* 08f76af (tag: ValidTag, main) Second commit on main
| * 11d1be8 (HEAD -> feature) Commit on feature
|/
* 94f12ca First commit on main

如果你能跑

$ git tag --no-merged main --no-merged feature
TagNotOnAnyBranch

你会得到正确的结果。但是如果有很多分支,这是累人的。您可以使用分支命令创建所有--no-merged参数:

$ git branch --all --list --format="--no-merged %(refname:short) "
--no-merged feature
--no-merged main

如果你使用bash或类似的,并把它们放在一起:

$ git tag $(git branch --all --list --format="--no-merged %(refname:short) ")
TagNotOnAnyBranch

注意事项:如果分支较多,可能会遇到命令字符长度上限。

相关问题