使指定标记范围内的日志按预期工作:
git log v1..v2 --oneline
但是,我希望标记范围日志为origin/master
。当我提供标签范围和远程/分支参数时,我没有得到预期的结果。
git log origin/master v1..v2 --oneline
输出与完全不提供v2
的输出相同。实际上,当移除v2
时,输出是v1
的{{1}}到HEAD
。
如何使此命令符合标记范围参数?
Git版本2.9.0
答案 0 :(得分:1)
问题在于:
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
代表一次提交。 名称 br1
,br2
和br3
每个指向一个特定提交,这是每个分支的提示。
实际的提交本身就指向了之前的提交。我在这里给出了两个特殊的提交A
和B
单字母名称:这些提交非常有趣,因为提交B
在上分支{ {1}}和br1
,提交br2
位于所有三个分支上。这是因为“A
之后有两个提交指向B
。提交B
是分支B
和br1
的合并基础,因此它位于两个分支上。同样,br2
指向B
,但分支A
上的提交也是如此:提交br3
是A
和br3
的合并基础}(以及br2
和提交br3
的合并基础)。因此B
位于A
和br2
两个分支上,br3
位于B
,br1
也必须位于A
}。
跟随提交(在此图中向左)提交到父提交的想法是Git如何确定可达性。
将br1
和v1
视为特定提交的标签,就像分支名称一样,因为这就是Git使它们工作的方式。标记名称和分支名称都只是一个特定提交的名称。区别在于标记名称是全局的 - 您的标记v2
应与其他所有人的v2
匹配 - 并且标记名称不应移动。当我们向分支添加新提交时,像v2
这样的分支名称会自动移动。标签名称不是。
让我们绘制另一张图,这次是br2
和v1
。我没有您的存储库,因此这不是您的存储库的准确图表,但我希望它能说明原则:
v2
当我们说...--o--v1--A--B--C--D--v2 <-- branch
\ \
F--G--H--I---J--K <-- origin/master
时,我们要求Git“绘制提交v1,以及所有早期的提交,暂时为红色”。这使我们不会被我们提供的其他名称或ID选中。然后,当我们说^v1
时,我们要求Git“绘制提交v2,以及之前未上漆的提交,暂时为绿色。”这会对v2
,D
,C
和B
进行绘制,但会在此之后停止,因为A
被涂成红色。
添加v1
告诉Git绘制提交origin/master
绿色,然后向后工作。提交K
是合并提交,因此Git将J
设为绿色,然后开始绘制两个父项J
和{{1} }}。最终它会回到已经红色的D
,所以它会停在那里。
最后,Git查看了所有绿色绘制的提交。这是I
到v1
加上A
的全部内容。
如果我们遗漏K
- 如果我们要求
v2
例如 - 我们将不再看到提交v2
本身,因为它从未被暂时涂成绿色;但我们仍会看到所有git log ^v1 origin/master
到v2
。
请注意,此A
表单相当于K
。我想你正在写^v1 origin/master
或v1..origin/master
(请注意origin/master v1..
之后的空格!);在这种情况下,“缺失”名称将填入v1.. origin/master
,它为您当前的提交命名。所以这些其他命令使用..
作为红色涂料和绿色涂料名称。
除此之外:首先完成所有“红漆”(帽子前缀)操作;或者等价地,你可以把它想象成“在绿色上涂红色,但从不在红色上涂上绿色”,并按任意顺序进行。 (记住,在Git命令完成后,所有的油漆都会再次洗掉。:-))