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

我想看到所有分支是abcdef1234祖先。

这与以下情况相反:

git branch --contains abcdef1234

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

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

UPDATE

为了更加清楚,我的意思是我想看到满足2个条件的所有提交列表:

  • 他们是abcdef1234祖先
  • 他们目前由(本地或远程)分支机构指出。
  • 很明显,大多数承诺在某个时候都有一个分支指向他们,当他们是全新的。 我只关心他们在这个特定时刻是否是分支机构。


    git branch --merged abcdef1234应该做你想做的。 它列出了合并到指定提交中的所有分支(因而是它们的祖先),即那些提交的提交可以从指定的提交中获得的分支。


    这是我以扩展的形式作为评论建议的内容。 (我认为这是你要求的。)

    我们将K设置为您选择的提交(在您的示例中为abcdefg1234 )。 然后,我们要遍历所有标签L,其中L的形式为refs/heads/*refs/remotes/* (所有分支和远程跟踪分支)。 每个标签L指向一些特定的提交C.如果C是K的祖先,则打印标签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的分支; 它是git branch -a的输出git branch -a减去git branch -a的输出git branch -a --contains abcdefg1234

    链接地址: http://www.djcxy.com/p/26055.html

    上一篇: How can I list all branches that are ancestors of a commit?

    下一篇: how can I check whether a branch has been merged into another branch?