为什么 git 中的双点与三点对于 diff 和 log 的行为不同

Wou*_*pen 11 git

首先:StackOverflow 上已经有两个关于这个主题的问题有可靠的答案,但我仍然感到困惑。我有点理解“什么”,但不明白“为什么”。

我的问题是:为什么显示git log A..B (双点)从 B 到 A 的提交列表,但为了获得同一组提交的差异,必须编写git diff A...B (三点)

git log如果和git diff会以同样的方式对待提交范围,不是会更加一致吗?现在它们的行为似乎彼此正交。

也许我缺少一些关于为什么要这样设计的见解?

Git 日志与差异

Cat*_*kul 5

看来这只是设计上的错误

\n

朱尼奥·C·滨野 @ 2019-12-23 18:02 :

\n
\n

使用“git diff”时请忘记点点和三点,这不是关于范围,而是关于比较两个端点。如果我们今天从头开始重新发明 Git,我们将使“git diff A..B”成为一个错误。您可以认为该命令接受范围符号是一个错误,但如果没有大规模的\n努力来查找和修复长期 Git 用户多年来编写的脚本中语法的使用,这种情况不会很快改变。

\n
\n
\n

在“git diff”的命令行上允许点点,而不是\n将它们诊断为错误并死亡,是我们(嗯,\n主要是Linus,但我也愿意承担责任)犯的一个愚蠢的错误,因为\当我们重用我们发明的机器时,我们的懒惰是为了解析\n“log”系列命令的命令行来指定范围,\n解析“diff”的命令行,这意外地导致了\n允许其所在范围的语法不应该被允许。

\n
\n
\n

更糟糕的是,由于只有点点和三点\n后来才出现,“git diff A..B”最终比较了端点 A 和 B,\n因为甚至没有 A...B符号存在。

\n
\n
\n

这不仅限于您,现代 Git 的任何用户都最好\n假装“git diff A..B”不存在;使用“git diff”时请忘记点点\n和三点,这样你会更高兴。

\n
\n

如果您想知道朱尼奥是谁:

\n
\n

Junio Hamano(日语:\xe6\xbf\xb1\xe9\x87\x8e \xe7\xb4\x94)是一位来自日本的软件工程师和黑客。他因领导一支维护 Git 的大型软件开发人员团队而闻名。最初的开发者 Linus Torvalds 表示,他的一大成功是认识到 Hamano 作为开发者的技能。

\n
\n


Mor*_*ort 4

git diff总是只对两个提交(refs)进行操作,永远不会更多也不会更少,并显示它们之间的差异。它没有对“范围”做任何事情,只是两次提交。

git log另一方面,显示提交范围,您可以通过多种不同方式指定任意数量的范围。就在那里,您会看到 git diff 和 git log 的行为会有所不同。

我认为您甚至无法将两次提交与一系列提交进行比较。我认为更多的是“..语法是‘从 .. 到’的简写,这种简写在不同的上下文中意味着不同的东西。但后来我们意识到,有一个非常频繁需要的‘从 .. 的最后一个共同祖先到’中的习语git diff,因此我们制作了类似但略有不同的...语法。”

  • @eftshift0 - 这是不对的。这就是“git diff A...B”的定义。请参阅 https://git-scm.com/docs/git-diff (4认同)