如何列出从特定分支的任何提交创建的所有 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
不酷。我想看到的是 develop
和 feature/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 的评论)。
有几个问题与我的问题接近,但又不完全相同。
我想列出所有分支,从 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
不酷。我想看到的是 develop
和 feature/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 的评论)。