如何显示今天哪些分支合并为主

时间:2014-07-29 22:27:44

标签: git logging

我知道我可以做到

git branch --merged

显示已合并的内容,但它只输出所有内容。有没有办法按日期过滤?

1 个答案:

答案 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曾经被命名为zorgzorg被合并到mainline,而aux为否的事实更长时间合并到mainline

因此,您需要自己回答的问题是,可以在这些分支标签名称中添加多少库存,可以随意创建和删除;以及是否查找合并提交并将它们与分支名称指向“计数”的提交进行比较;然后询问提交中的两个日期之一是否足以作为您的过滤器。

有两个日期,“作者”和“提交者”,以及两个用户名和电子邮件地址。您可能想要提交者日期,尽管通常两者是相同的,并且对于合并,具有不同的日期尤为罕见。此外,请注意您可能需要允许时区(取决于您自己的“今天是否”测试)。


如何获取提交日期

对于每个分支 b git branch --merged声明合并到目标分支(让我们调用目标 t )...

  1. 我们知道名称​​ b 指向的提交是 t 指向的提交的祖先。使用git rev-parse获取每个 b 的原始SHA-1。
  2. 使用git rev-list --merges t,我们可以找到作为 t 的祖先的合并提交的修订。
  3. 对于每个提取的SHA-1,查看其所有父提交ID(您可以git rev-list与提交一起生成这些ID;请参阅--parents)。
  4. 如果父级匹配任何分支 b 之一的ID,则您具有将分支 b 合并到 t 的合并提交>。因此,请检查合并提交的日期。在任何情况下,从日期检查所需的项目列表中删除 b 的SHA-1。
  5. 重复上述操作,直到消耗了所有分支b的所有SHA-1,否则您的合并用完了。