如何列出作为提交祖先的所有分支



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

这与相反

git branch --contains abcdef1234

上面的命令将列出作为abcdef1234的子代的所有分支。我想查看作为abcdef1234祖先的所有分支的列表。

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

更新

更清楚地说,我的意思是,我想看到一个符合两个标准的所有提交的列表:

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

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

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

以下是我以扩展形式提出的评论。(我想这就是你想要的。)

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

[编辑:正如sschuberth所回答的,这只是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这样的符号引用。)

comm -23 <(git branch -a | sort) <(git branch -a --contains abcdefg1234 | sort)

这将为您提供所有没有提交abcdefg1234的分支;它是CCD_ 19的输出减去CCD_。

最新更新