首先:StackOverflow 上已经有两个关于这个主题的问题有可靠的答案,但我仍然感到困惑。我有点理解“什么”,但不明白“为什么”。
我的问题是:为什么显示git log A..B (双点)从 B 到 A 的提交列表,但为了获得同一组提交的差异,必须编写git diff A...B (三点)。
git log如果和git diff会以同样的方式对待提交范围,不是会更加一致吗?现在它们的行为似乎彼此正交。
也许我缺少一些关于为什么要这样设计的见解?
看来这只是设计上的错误:
\n朱尼奥·C·滨野 @ 2019-12-23 18:02 :
\n\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\nJunio Hamano(日语:\xe6\xbf\xb1\xe9\x87\x8e \xe7\xb4\x94)是一位来自日本的软件工程师和黑客。他因领导一支维护 Git 的大型软件开发人员团队而闻名。最初的开发者 Linus Torvalds 表示,他的一大成功是认识到 Hamano 作为开发者的技能。
\n
git diff总是只对两个提交(refs)进行操作,永远不会更多也不会更少,并显示它们之间的差异。它没有对“范围”做任何事情,只是两次提交。
git log另一方面,显示提交范围,您可以通过多种不同方式指定任意数量的范围。就在那里,您会看到 git diff 和 git log 的行为会有所不同。
我认为您甚至无法将两次提交与一系列提交进行比较。我认为更多的是“..语法是‘从 .. 到’的简写,这种简写在不同的上下文中意味着不同的东西。但后来我们意识到,有一个非常频繁需要的‘从 .. 的最后一个共同祖先到’中的习语git diff,因此我们制作了类似但略有不同的...语法。”