如何列出从特定分支的任何提交创建的所有 git 个分支

How to list all git branches created from any commit of a particular branch

有几个问题与我的问题接近,但又不完全相同。

我想列出所有分支,从 git 分支创建 在该分支历史记录中的任何时间点

类似问题的答案包括使用 git branch --contains [branch-name],但这并不能满足我的要求。

考虑以下(简单的)示例和树:

$ git init
$ git checkout -b master
$ touch master.txt
$ git add .
$ git commit -m "Initial master commit"
$ git checkout -b develop
$ touch develop.txt
$ git add .
$ git commit -m "Initial develop commit"
$ git checkout -b feature/a
$ touch a.txt
$ git add .
$ git commit -m "feature/a commit"
$ git checkout develop
$ git checkout -b feature/b
$ touch b.txt
$ git add .
$ git commit -m "feature/b commit"

master
      \
       \         feature/a
        \       /
         develop
                \
                 feature/b

如果我想获取包含 develop 分支的所有分支,我可以执行 git branch --contains develop 并且我会得到以下结果:

$ git branch --contains develop

  develop
  feature/a
  feature/b

酷。但是让我们使用一个更真实的示例(- 是提交),其中有多个功能分支在不同时间合并:

$ git checkout develop
$ git merge feature/a
$ git branch -d feature/a

master
      \
       \         feature/a
        \       /         \
         develop           -
                \
                 feature/b

在这种情况下,feature/a完成,合并到develop,然后删除。现在 develop 的最新提交领先于 feature/b,这仍在进行中。现在,如果我 运行 git branch --contains develop,我得到以下信息:

$ git branch --contains develop

  develop

不酷。我想看到的是 developfeature/b,因为 feature/b 是从 develop.

的旧提交中分支出来的

我有一个复杂的项目,其中包含大量功能、错误修复、增强等分支,这些分支由 develop 生命周期中的各个点组成,但并非所有分支都被引入,现在 git branch --contains develop 在告诉我哪些分支是优秀的方面毫无用处。

我意识到 的答案是什么,因为我正在写这个问题(是的,让我对 "paper" 有了想法)。

命令git branch --contains develop只考虑develop分支的最新提交,所以需要获取develop分支的第一个提交SHA。

不幸的是,这就是事情变得棘手的地方。来自 Pro Git § 3.1 Git Branching - What a Branch Is:

A branch in Git is simply a lightweight movable pointer to [a] commit.

由于分支只是一个轻量级指针,git 没有关于其历史或创建日期的明确概念。

我花了太长时间寻找一种方法来获取分支的原始提交 SHA,并最终想出了一个方法,但是有一些 prerequisites/limitations。

  • 您需要知道您想要哪个分支的原始提交 SHA(在我们的例子中,develop
  • 你需要知道它从哪个分支分支出来,那个分支不能在它前面(在我们的例子中,master)——这绝对不是理想,但欢迎任何人提供更好的答案:)
$ git branch --contains $(git rev-list master..develop | tail -1)

  develop
  feature/b

如果你很好奇,$() 中的内容是我如何从 git 修订列表中获取最早的提交 SHA(比原始方法更好,感谢@alfunx 的评论)。