我知道我可以做到
git branch --merged
显示已合并的内容,但它只输出所有内容。有没有办法按日期过滤?
答案 0 :(得分:2)
不,是的,取决于你真正打算提出的问题。
分支标签是临时的东西,随心所欲地创建和销毁。这是一个提交图,其中创建了一个分支,一方添加了两个提交(新分支),另一方(原始分支)添加了一个提交,合并了两个提交,最后添加了另一个提交。在此过程中,合并分支的名称已被删除。
我用星号*
标记了实际的合并提交;其余的提交节点只是普通的o
节点。
请注意,这里没有额外的分支标签,只有主线。
o--o--o---*--o <-- mainline
\ /
o--o
如果您询问哪些分支合并到mainline
,则只有mainline
本身。
现在让我们添加另一个分支标签,以便更清楚地了解情况:
$ git branch aux mainline~1^2
图表现在完全相同,但我们添加了一个名为aux
的分支标签:
o--o--o---*--o <-- mainline
\ /
o--o <-- aux
如果您询问哪些分支合并到mainline
,答案现在是mainline
本身以及aux
。
aux
何时合并到mainline
? 不是:分支在合并时被命名为zorg
。该名称已被删除,并且创建了一个新名称,以便aux
来自git branch --merged
。
让我们添加第三个分支标签,只是为了说明它可能更糟糕:
$ git branch newbranch mainline~3
,并提供:
............<-- newbranch
.
o--o--o---*--o <-- mainline
\ /
o--o <-- aux
您可以找到的内容(它不是很简单,需要一些花哨的步法)是在创建感兴趣的合并提交时。在这种情况下,那是*
提交。它是现在标记为aux
(以及之前为zorg
)的提交的后代,在这种特殊情况下,它是该提交的直接父(第二个父)。
请注意,这将忽略未明确合并到分支中的分支,例如newbranch
。在这种情况下,newbranch
是一个分支,可以在mainline
的提示之前的提交中增长(但尚未增长)。 (git branch --merged
会列出它,你可能会,也可能不会想要计算它。)
当然,名称zorg
早已不复存在(分支标签在git中自然是临时的),如果有人偷偷摸摸并删除我们刚创建的名称aux
,那么就是那个。或者,如果有人在现在命名的aux
分支上添加新提交,我们会得到这个新图:
o--o--o---*--o <-- mainline
\ /
o--o--o <-- aux
现在*
提交不再是标记为aux
的提交的直接后代。但是,我们可以确定*
是标记为aux
的提交的祖先的直接后代。但是,我们不能(没有额外的帮助)重建aux~1
曾经被命名为zorg
,zorg
被合并到mainline
,而aux
为否的事实更长时间合并到mainline
。
因此,您需要自己回答的问题是,可以在这些分支标签名称中添加多少库存,可以随意创建和删除;以及是否查找合并提交并将它们与分支名称指向“计数”的提交进行比较;然后询问提交中的两个日期之一是否足以作为您的过滤器。
有两个日期,“作者”和“提交者”,以及两个用户名和电子邮件地址。您可能想要提交者日期,尽管通常两者是相同的,并且对于合并,具有不同的日期尤为罕见。此外,请注意您可能需要允许时区(取决于您自己的“今天是否”测试)。
对于每个分支 b ,git branch --merged
声明合并到目标分支(让我们调用目标 t )...
git rev-parse
获取每个 b 的原始SHA-1。git rev-list --merges t
,我们可以找到作为 t 的祖先的合并提交的修订。git rev-list
与提交一起生成这些ID;请参阅--parents
)。重复上述操作,直到消耗了所有分支b
的所有SHA-1,否则您的合并用完了。