【问题标题】:How can I list all branches that are ancestors of a commit?如何列出作为提交祖先的所有分支?
【发布时间】:2016-09-10 01:40:38
【问题描述】:

我想查看所有提交 abcdef1234 的祖先的分支。

这有点像:

git branch --contains abcdef1234

上面的命令会列出所有abcdef1234 的后代分支。我想查看所有属于 abcdef1234 祖先的分支的列表。

我也对标签的等价物感兴趣。

更新

更清楚地说,我的意思是我想查看满足 2 个条件的所有提交的列表:

  1. 他们是abcdef1234的祖先
  2. 它们当前由(本地或远程)分支指向。

显然大多数提交在某个时候都有一个指向它们的分支,当它们是全新的时候。我只对他们在这个特定时刻是否是分支感兴趣。

【问题讨论】:

  • 您能否举例说明拥有作为提交祖先的分支对您意味着什么?我无法理解您的问题,因为分支是作为指向分支头部提交的“指针”实现的,因此 Git 没有任何关于过去哪些提交属于或不属于哪些分支的历史记录。跨度>
  • 它是什么? “更清楚地说,我的意思是我想查看所有提交的列表”或“我想查看所有分支”你应该编辑你的问题并删除一个或另一个
  • 所以,你想要的是:(K 是选择提交)forall labels L: C = target(L); if C subseteq K: print L.
  • @JeffPuckettII 我宁愿查看分支名称列表,但如果它显示提交 SHA 列表,我可以使用 git show-ref 或类似的东西轻松地从那里到达分支名称。
  • @torek 这是我可以在命令行上运行的东西,还是伪代码?

标签: git


【解决方案1】:

这是我建议的评论,以扩展的形式。 (我想这就是你要的。)

我们将 K 设置为您选择的提交(在您的示例中为abcdefg1234)。然后,我们要遍历所有标签 L,其中 L 的形式为 refs/heads/*refs/remotes/*(所有分支和远程跟踪分支)。每个标签 L 指向某个特定的提交 C。如果 CK 的祖先,则打印标签 L

[编辑:作为sschuberth answered,这只是git branch --merged;我想到的新功能是git for-each-ref 现在也实现了--merged,这意味着您可以更轻松地编写脚本,但如果您想要的只是名称git branch 可以做到。如果您确实需要标签,请参阅git tag --merged(如果有)。如果您的 Git 版本太旧,请继续阅读脚本。 :-)]

这是一个实现此功能的 shell 脚本(未经测试!)。请注意,git for-each-ref 在更高版本的 Git 中具有新功能,可以简化这一点,但这应该可以一直追溯到 1.6-ish——也许是 1.7-ish;我忘记了git merge-base 何时获得--is-ancestor

#! /bin/sh

# find branches and remote-tracking branches that targt
# ancestors of $1.
showthem() {
    local tgt label lbltgt
    tgt=$(git rev-parse "$1") || return $?
    git for-each-ref --format='%(refname:short) %(objectname)' \
            refs/heads refs/remotes |
        while read label lbltgt; do
            if git merge-base --is-ancestor $lbltgt $tgt; then
                echo "$label"
            fi
        done
    return 0
}

case $# in
0) usage 1>&2; exit 1;;
1) showthem "$1";;
*) for i do "echo ${i}:"; showthem "$i" || exit; done
esac

(您可能需要稍微调整一下,例如,丢弃像 origin/HEAD 这样的符号引用。)

【讨论】:

  • 我对你投了赞成票,因为我很欣赏你的努力,因为这确实展示了一些很酷的功能。
【解决方案2】:
comm -23 <(git branch -a | sort) <(git branch -a --contains abcdefg1234 | sort)

这会给你所有没有提交abcdefg1234的分支;这是git branch -a 的输出减去git branch -a --contains abcdefg1234 的输出。

【讨论】:

    【解决方案3】:

    git branch --merged abcdef1234 应该做你想做的事。它列出了合并到命名提交中的所有分支(因此是它的祖先),即那些提示提交可以从命名提交中访问的分支。

    【讨论】:

    • 天哪,我应该记得这个。使用-r 运行以获取远程跟踪分支或使用-a 运行以获取所有分支。
    • 这让我找到了git branch --no-merged origin/master,这也非常有用。
    • 不幸的是,git tag 似乎没有与 --merged 等效的对象
    • 较新版本的 Git 确实有 git tag --merged(和 --no-merged)。对于那些不这样做的人,使用for-each-ref,就像我展示的那样,只需使用refs/tags 作为标签名称空间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2023-03-27
    • 2023-03-20
    • 2016-03-01
    • 1970-01-01
    相关资源
    最近更新 更多