为什么在git中双点和三点用于diff和log时表现不同

11
首先:关于这个主题,StackOverflow上已经有两个问题有很好的答案,但我仍然感到困惑。我对“什么”有点理解,但不知道“为什么”。
链接如下: 我的问题是:为什么git log A..B(双点)显示从B到A的提交列表,但要获得相同一组提交的差异,则必须编写git diff A...B(三点)。
如果git loggit diff以相同的方式处理提交范围,那不是更加一致吗?它们现在似乎是相互正交的行为。
也许我对为什么它被设计成这样缺乏某种洞察力?

Git log vs diff


Mort的回答很不错,但最终,当你问“为什么人X执行操作Y”时,除非X本人写下了自己的理由,否则我们最终都只能猜测。也许你需要问Linus。请注意,在使用git log中的A..B时,你永远看不到提交A本身,而在使用git diff A..B时,两个输入中的一个是A本身:这是某种不一致性。 - torek
你不一定需要猜测。通常会有公开的讨论,可以参考来回答这个问题。 - Catskul
2个回答

5
似乎这只是一个设计错误: < p > Junio C Hamano @ 2019-12-23 18:02 : < blockquote >

请在使用“git diff”时忘记点点和三个点,因为它不是关于范围而是关于比较两个端点。如果我们今天从头开始重新发明Git,我们将使“git diff A..B”成为错误。您可以认为它接受了一个范围符号的命令是一个错误,但是这不会很快改变,除非长期使用Git的用户在多年中编写的脚本中找到并修复语法的用途。

在 "git diff" 命令行中允许使用点点符号(..)而不是将其诊断为错误并终止,这是我们(主要是 Linus,但我也愿意承担责任)由于懒惰而犯的一个愚蠢错误。我们重用了用于解析“log”系列命令的命令行的机制,并解析了“diff”命令的命令行,导致在不应该允许范围语法的情况下允许了范围语法。
更糟糕的是,由于只有两个点(..)符号,而三个点符号(...)出现得很晚,所以 "git diff A..B" 最终比较的是端点 A 和 B,因为甚至不存在 A...B 符号。
这不仅限于您,而是适用于所有现代 Git 用户,最好假装 "git diff A..B" 不存在;当使用 "git diff" 时,请忘记点点和三个点符号,你会更开心的。
如果你想知道 Junio 是谁:
Junio Hamano(日文名:濱野純)是一位来自日本的软件工程师和黑客。他最著名的成就是领导一个庞大的软件开发团队来维护Git。原始开发者Linus Torvalds曾经说过,他的一个巨大成功之一就是认识到了Hamano作为开发者的技能。

4

git diff 始终只对 两个提交(refs)进行操作,永远不会多也不会少,并显示它们之间的差异。它不会处理“范围”,只是两个提交。

另一方面,git log 显示提交范围,您可以以多种不同的方式指定任意数量的范围。因此,您可以看到 git diff 和 git log 将有不同的行为。

我甚至认为您无法使用提交范围比较两个提交。我认为这更像是“.. 语法是 '从..到' 的简写,并且该简写在不同的环境中意义不同。但后来我们意识到,在 git diff 中有一个非常常见的“从最后一个共同祖先到”的习惯用法,因此我们做了类似但略有不同的 ... 语法。”


在我看来:git diff A..B = git diff $( git merge-base A B )..B - eftshift0
4
@eftshift0 - 那不正确。那是git diff A...B的定义。请参阅https://git-scm.com/docs/git-diff。 - Mort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接