获取 git 远程分支的日志范围

Get git log range of remote branch

获取指定标签范围内的日志按预期工作:

git log v1..v2 --oneline

但是,我想要origin/master的标签范围日志。当我提供标签范围和 remote/branch 参数时,我没有得到预期的结果。

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

输出与根本未提供 v2 相同。事实上,当v2被移除时,输出是从v1HEAD of origin/master.

如何让这个命令遵守标签范围参数?

Git 版本 2.9.0

问题在于:

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 代表一次提交。 names br1br2br3 每个 指向 一个特定的提交,这是每个分支的提示提交。

实际的提交本身指向他们之前的提交。我在这里给出了两个特定的提交 AB 单字母名称:这些提交非常有趣,因为提交 Bboth 分支 br1br2,提交 A 所有三个 分支上。这是因为有两个提交 "after" B 都指向 B。提交 B 是分支 br1br2 合并基础 ,因此它在两个分支上。同样,B 指向 A,但分支 br3 上的提交也是如此:提交 Abr3 和 [=22= 的合并基础](以及 br3 和提交 B 的合并基础)。所以 Abr2br3 两个分支上,并且由于 Bbr1 上,A 也必然在 [=21= 上].

跟随提交(在此图中向左)到他们的 父级 提交的想法是 Git 确定此 可达性.

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

让我们再画一张图,这次有一个v1v2。我没有你的存储库,所以这不是 你的 存储库的准确图表,但我希望它能说明原理:

...--o--v1--A--B--C--D--v2    <-- branch
         \            \
          F--G--H--I---J--K   <-- origin/master

当我们说 ^v1 时,我们在问 Git 到 "paint commit v1, and all earlier commits, red temporarily"。这可以防止它们被我们提供的其他名称或 ID 选择。然后,当我们说 v2 时,我们要求 Git 到 "paint commit v2, and earlier unpainted commits, green temporarily." This paints D, C, B, and A,但在那之后停止,因为 v1 被涂成红色。

添加 origin/master 告诉 Git 将提交 K 涂成绿色,并向后工作。提交 J 是一个 merge 提交,因此 Git 绘制 J 绿色然后开始绘制 both parents , DI。最终它回到已经是红色的 v1 所以它停在那里。

最后,Git 查看所有涂成绿色的提交。这就是 AK 加上 v2.

的全部内容

如果我们省略 v2——如果我们要求

git log ^v1 origin/master

例如——我们将不再看到提交 v2 本身,因为它从未被暂时涂成绿色;但我们仍然会看到所有 AK.

请注意,这个 ^v1 origin/master 形式等同于 v1..origin/master。我认为您正在写 origin/master v1..v1.. origin/master(注意 .. 之后的 space!);在这种情况下,"missing" 名称用 HEAD 填充,它命名您当前的提交。所以这些其他命令使用 ^v1 HEAD origin/master 作为红色油漆和绿色油漆名称。

旁白:所有"red paint"(帽子前缀)操作都先完成;或者等价地,您可以将其视为 "paint red over green, but never paint green over red" 并按任意顺序执行。 (请记住,在 Git 命令完成后,所有油漆都会再次被洗掉。:-))