获取 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
被移除时,输出是从v1
到HEAD
of origin/master
.
如何让这个命令遵守标签范围参数?
Git 版本 2.9.0
问题在于:
git log origin/master v1..v2 --oneline
并不代表你认为的意思。
The gitrevisions syntax v1..v2
是 v2 ^v1
的缩写。当您将它与 origin/master
结合使用时,您将 Git 所有三个选择器:
- 包括任何提交 可从 标记
v2
;
- 包括任何提交可从远程跟踪分支名称
origin/master
;
- 但排除(从整个列表中)任何和所有这样的提交可从标签
v1
到达。
假设您有这张图:
o--o--o <-- br1
/
...--o--A--B--o <-- br2
\
o--o--o <-- br3
其中每一轮 o
代表一次提交。 names br1
、br2
和 br3
每个 指向 一个特定的提交,这是每个分支的提示提交。
实际的提交本身指向他们之前的提交。我在这里给出了两个特定的提交 A
和 B
单字母名称:这些提交非常有趣,因为提交 B
在 both 分支 br1
和 br2
,提交 A
在 所有三个 分支上。这是因为有两个提交 "after" B
都指向 B
。提交 B
是分支 br1
和 br2
的 合并基础 ,因此它在两个分支上。同样,B
指向 A
,但分支 br3
上的提交也是如此:提交 A
是 br3
和 [=22= 的合并基础](以及 br3
和提交 B
的合并基础)。所以 A
在 br2
和 br3
两个分支上,并且由于 B
在 br1
上,A
也必然在 [=21= 上].
跟随提交(在此图中向左)到他们的 父级 提交的想法是 Git 确定此 可达性.
将 v1
和 v2
视为特定提交的标签,就像分支名称一样,因为这就是 Git 使它们工作的方式。标记名称和分支名称都只是一个特定提交的名称。不同之处在于标签名称是全局的——您的标签 v2
应该与其他人的 v2
相匹配——并且标签名称 不应该移动 。当我们向分支添加新提交时,像 br2
这样的分支名称会自动移动 。标签名称没有。
让我们再画一张图,这次有一个v1
和v2
。我没有你的存储库,所以这不是 你的 存储库的准确图表,但我希望它能说明原理:
...--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 , D
和 I
。最终它回到已经是红色的 v1
所以它停在那里。
最后,Git 查看所有涂成绿色的提交。这就是 A
到 K
加上 v2
.
的全部内容
如果我们省略 v2
——如果我们要求
git log ^v1 origin/master
例如——我们将不再看到提交 v2
本身,因为它从未被暂时涂成绿色;但我们仍然会看到所有 A
到 K
.
请注意,这个 ^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 命令完成后,所有油漆都会再次被洗掉。:-))
获取指定标签范围内的日志按预期工作:
git log v1..v2 --oneline
但是,我想要origin/master
的标签范围日志。当我提供标签范围和 remote/branch 参数时,我没有得到预期的结果。
git log origin/master v1..v2 --oneline
输出与根本未提供 v2
相同。事实上,当v2
被移除时,输出是从v1
到HEAD
of origin/master
.
如何让这个命令遵守标签范围参数?
Git 版本 2.9.0
问题在于:
git log origin/master v1..v2 --oneline
并不代表你认为的意思。
The gitrevisions syntax v1..v2
是 v2 ^v1
的缩写。当您将它与 origin/master
结合使用时,您将 Git 所有三个选择器:
- 包括任何提交 可从 标记
v2
; - 包括任何提交可从远程跟踪分支名称
origin/master
; - 但排除(从整个列表中)任何和所有这样的提交可从标签
v1
到达。
假设您有这张图:
o--o--o <-- br1
/
...--o--A--B--o <-- br2
\
o--o--o <-- br3
其中每一轮 o
代表一次提交。 names br1
、br2
和 br3
每个 指向 一个特定的提交,这是每个分支的提示提交。
实际的提交本身指向他们之前的提交。我在这里给出了两个特定的提交 A
和 B
单字母名称:这些提交非常有趣,因为提交 B
在 both 分支 br1
和 br2
,提交 A
在 所有三个 分支上。这是因为有两个提交 "after" B
都指向 B
。提交 B
是分支 br1
和 br2
的 合并基础 ,因此它在两个分支上。同样,B
指向 A
,但分支 br3
上的提交也是如此:提交 A
是 br3
和 [=22= 的合并基础](以及 br3
和提交 B
的合并基础)。所以 A
在 br2
和 br3
两个分支上,并且由于 B
在 br1
上,A
也必然在 [=21= 上].
跟随提交(在此图中向左)到他们的 父级 提交的想法是 Git 确定此 可达性.
将 v1
和 v2
视为特定提交的标签,就像分支名称一样,因为这就是 Git 使它们工作的方式。标记名称和分支名称都只是一个特定提交的名称。不同之处在于标签名称是全局的——您的标签 v2
应该与其他人的 v2
相匹配——并且标签名称 不应该移动 。当我们向分支添加新提交时,像 br2
这样的分支名称会自动移动 。标签名称没有。
让我们再画一张图,这次有一个v1
和v2
。我没有你的存储库,所以这不是 你的 存储库的准确图表,但我希望它能说明原理:
...--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 , D
和 I
。最终它回到已经是红色的 v1
所以它停在那里。
最后,Git 查看所有涂成绿色的提交。这就是 A
到 K
加上 v2
.
如果我们省略 v2
——如果我们要求
git log ^v1 origin/master
例如——我们将不再看到提交 v2
本身,因为它从未被暂时涂成绿色;但我们仍然会看到所有 A
到 K
.
请注意,这个 ^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 命令完成后,所有油漆都会再次被洗掉。:-))