有几个问题与我要问的问题接近,但不完全相同。
我想列出在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
不酷。我想看到的是develop
和feature/b
,因为feature/b
是从develop
的较早提交分支出来的。
我有一个复杂的项目,其中包含许多功能,错误修复,增强功能等。分支在develop
的生命周期中是由各个点组成的,而并不是所有分支都已被引入,对吧?现在git branch --contains develop
告诉我哪些分支是杰出的,这是毫无用处的。
答案 0 :(得分:4)
我在总结问题时才意识到答案是 。
命令git branch --contains develop
仅考虑develop
分支的最新提交,因此您需要获取develop
分支的第一次提交SHA。
不幸的是,这是棘手的地方。来自Pro Git § 3.1 Git Branching - What a Branch Is:
Git中的分支只是指向[a]提交的轻量级可移动指针。
由于分支只是轻量级的指针,因此git对其历史或创建日期没有明确的定义。
我花了很长时间来共同探索一种方法,以获取分支的原始提交SHA,最后提出了一种方法,但是有一些先决条件/限制。
develop
)master
)-绝对不理想,但是任何人都可以欢迎提供更好的答案:)$ git branch --contains $(git rev-list master..develop | tail -1)
develop
feature/b
如果您很好奇,$()
中的内容就是我如何从git rev列表中获得最早的提交SHA(比起原来的方法,要好得多,这要感谢@alfunx的评论)。