获取远程分支的git log范围

时间:2017-03-10 14:52:57

标签: git git-log

使指定标记范围内的日志按预期工作:

git log v1..v2 --oneline

但是,我希望标记范围日志为origin/master。当我提供标签范围和远程/分支参数时,我没有得到预期的结果。

git log origin/master v1..v2 --oneline

输出与完全不提供v2的输出相同。实际上,当移除v2时,输出是v1的{​​{1}}到HEAD

如何使此命令符合标记范围参数?

Git版本2.9.0

1 个答案:

答案 0 :(得分:1)

问题在于:

git log origin/master v1..v2 --oneline

并不代表您认为的含义。

The gitrevisions syntax v1..v2v2 ^v1的缩写。当你将它与origin/master结合使用时,你给Git所有三个选择器:

  • 包含标记v2;
  • 中可以访问的任何提交
  • 包含远程跟踪分支名称origin/master可以访问的任何提交;
  • 排除(从整个列表中)可从标记v1访问的所有此类提交。

假设你有这张图:

             o--o--o   <-- br1
            /
...--o--A--B--o        <-- br2
         \
          o--o--o      <-- br3

其中每轮o代表一次提交。 名称 br1br2br3每个指向一个特定提交,这是每个分支的提示。

实际的提交本身就指向了之前的提交。我在这里给出了两个特殊的提交AB单字母名称:这些提交非常有趣,因为提交B分支{ {1}}和br1,提交br2位于所有三个分支上。这是因为“A之后有两个提交指向B。提交B是分支Bbr1合并基础,因此它位于两个分支上。同样,br2指向B,但分支A上的提交也是如此:提交br3Abr3的合并基础}(以及br2和提交br3的合并基础)。因此B位于Abr2两个分支上,br3位于Bbr1也必须位于A }。

跟随提交(在此图中向左)提交到提交的想法是Git如何确定可达性

br1v1视为特定提交的标签,就像分支名称一样,因为这就是Git使它们工作的方式。标记名称和分支名称都只是一个特定提交的名称。区别在于标记名称是全局的 - 您的标记v2应与其他所有人的v2匹配 - 并且标记名称​​不应移动。当我们向分支添加新提交时,像v2 这样的分支名称会自动移动。标签名称不是。

让我们绘制另一张图,这次是br2v1。我没有您的存储库,因此这不是您的存储库的准确图表,但我希望它能说明原则:

v2

当我们说...--o--v1--A--B--C--D--v2 <-- branch \ \ F--G--H--I---J--K <-- origin/master 时,我们要求Git“绘制提交v1,以及所有早期的提交,暂时为红色”。这使我们不会被我们提供的其他名称或ID选中。然后,当我们说^v1时,我们要求Git“绘制提交v2,以及之前未上漆的提交,暂时为绿色。”这会对v2DCB进行绘制,但会在此之后停止,因为A被涂成红色。

添加v1告诉Git绘制提交origin/master绿色,然后向后工作。提交K合并提交,因此Git将J设为绿色,然后开始绘制两个父项J和{{1} }}。最终它会回到已经红色的D,所以它会停在那里。

最后,Git查看了所有绿色绘制的提交。这是Iv1加上A的全部内容。

如果我们遗漏K - 如果我们要求

v2
例如

- 我们将不再看到提交v2本身,因为它从未被暂时涂成绿色;但我们仍会看到所有git log ^v1 origin/master v2

请注意,此A表单相当于K。我想你正在写^v1 origin/masterv1..origin/master(请注意origin/master v1..之后的空格!);在这种情况下,“缺失”名称将填入v1.. origin/master,它为您当前的提交命名。所以这些其他命令使用..作为红色涂料和绿色涂料名称。

除此之外:首先完成所有“红漆”(帽子前缀)操作;或者等价地,你可以把它想象成“在绿色上涂红色,但从不在红色上涂上绿色”,并按任意顺序进行。 (记住,在Git命令完成后,所有的油漆都会再次洗掉。:-))