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

时间:2019-10-17 19:25:21

标签: git merge contains

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

我想列出在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的最新提交要早于feature/b,该提交仍在进行中。现在,如果我运行git branch --contains develop,则会得到以下信息:

$ git branch --contains develop

  develop

不酷。我想看到的是developfeature/b,因为feature/b是从develop的较早提交分支出来的。

我有一个复杂的项目,其中包含许多功能,错误修复,增强功能等。分支在develop的生命周期中是由各个点组成的,而并不是所有分支都已被引入,对吧?现在git branch --contains develop告诉我哪些分支是杰出的,这是毫无用处的。

1 个答案:

答案 0 :(得分:4)

我在总结问题时才意识到答案是

命令git branch --contains develop仅考虑develop分支的最新提交,因此您需要获取develop分支的第一次提交SHA。

不幸的是,这是棘手的地方。来自Pro Git § 3.1 Git Branching - What a Branch Is

  

Git中的分支只是指向[a]提交的轻量级可移动指针。

由于分支只是轻量级的指针,因此git对其历史或创建日期没有明确的定义。

我花了很长时间来共同探索一种方法,以获取分支的原始提交SHA,最后提出了一种方法,但是有一些先决条件/限制。

  • 您需要知道要将原始提交SHA用于哪个分支(在我们的情况下为develop
  • 您需要知道分支的分支,并且该分支不能在其前面(在我们的示例中,master)-绝对不理想,但是任何人都可以欢迎提供更好的答案:)
$ git branch --contains $(git rev-list master..develop | tail -1)

  develop
  feature/b

如果您很好奇,$()中的内容就是我如何从git rev列表中获得最早的提交SHA(比起原来的方法,要好得多,这要感谢@alfunx的评论)。