不久前,我们有几个 PostgreSQL 黑客在一个房间里,有人监督我输入了类似的东西
git diff REL_14_STABLE...REL_15_STABLE
复制
他们想知道,“哦,我不知道三个dots”。我轻率的解释是,“当两个dots不能给出正确答案时,你就使用三个dots”。
但是,让我们打开它。
这个
git diff REL_14_STABLE REL_15_STABLE
复制
为您提供 PostgreSQL 14 和 PostgreSQL 15 之间的完全区别。这将是一个巨大的差异。
此差异不包括对 REL_14_STABLE
和所做的更改REL_15_STABLE
。例如, b9b21acc766db54d8c337d508d0fe2f5bf2daab0 已对两个分支进行了回补,因此它根本不会出现在上述差异中。
在查看像这样分散的稳定分支时,这几乎不是您想要的。查看特定文件的跨版本差异可能是有意义的,也许像这样:
git diff REL_14_STABLE REL_15_STABLE -- src/test/regress/parallel_schedule
复制
但是完整的差异通常没有用,至少对于手动检查是这样。
然后有
git diff REL_14_STABLE..REL_15_STABLE
复制
这与上面不带dots的命令完全相同。这两种形式是等价的。
那么现在让我们看看这三个dots:
git diff REL_14_STABLE...REL_15_STABLE
复制
git-diff文档说这相当于git diff $(git merge-base REL_14_STABLE REL_15_STABLE) REL_15_STABLE
. 结果git merge-base
是:
$ git merge-base REL_14_STABLE REL_15_STABLE e1c1c30f635390b6a3ae4993e8cac213a33e6e3f
复制
所以原来的命令等价于
git diff e1c1c30f635390b6a3ae4993e8cac213a33e6e3f REL_15_STABLE
复制
那有什么意义呢?请注意, e1c1c30f635390b6a3ae4993e8cac213a33e6e3f 在分支之后立即提交REL_15_STABLE
是
commit 596b5af1d3675b58d4018acd64217e2f627da3e4 Author: Andrew Dunstan <andrew@dunslane.net> Date: Mon Jun 28 17:31:16 2021 Stamp HEAD as 15devel. Let the hacking begin ...
复制
e1c1c30f635390b6a3ae4993e8cac213a33e6e3f
最后一次提交也是如此, 并且REL_14_STABLE
有REL_15_STABLE
共同之处。(这就是 Git 所说的“合并基础”,虽然这里没有合并。但如果你想将这两个分支合并在一起,这将是相关的。)
因此,三点变体git diff REL_14_STABLE...REL_15_STABLE
为您提供“REL_15_STABLE
自从它被分支以来的 所有内容REL_14_STABLE
”,本质上是“所有新内容 REL_15_STABLE
”(保存已回补到两者的补丁),这几乎总是我想要的。
请注意,此差异包括上面提到 的提交的回补版本b9b21acc766db54d8c337d508d0fe2f5bf2daab0
,因为它是新的,REL_15_STABLE
因为它是分支的,即使它在REL_14_STABLE
和 之间没有区别REL_15_STABLE
。
顺便说一句,等价形式是
git diff --merge-base REL_14_STABLE REL_15_STABLE
复制
我从来没有用过它,因为它有点太类型了,但它就在那里。
然后是git log
,它有类似的考虑,只是它们不同。
文档git log说, “ [l] 列出了可以通过遵循给定提交的父链接来访问的提交”。所以,
git log REL_15_STABLE
复制
列出从当前REL_15_STABLE
回溯到开始时间的所有提交。然后,
git log REL_14_STABLE REL_15_STABLE # WRONG!
复制
列出从当前REL_14_STABLE
和 REL_15_STABLE
回到开始时间的所有提交。默认情况下,提交按时间倒序排列,因此这实际上将显示来自两个分支的提交混合在一起。例如, REL_15_STABLE
我们上面的回补丁提交的版本 b9b21acc766db54d8c337d508d0fe2f5bf2daab0
显示在其等效提交旁边REL_14_STABLE
。因此,如果您曾经在 中“看到双重” git log
,那么您可能弄错了。
的文档git-log
继续说,“但排除可以从前面带有 ^ 的提交中到达的提交”。所以更明智的建设将是
git log REL_15_STABLE ^REL_14_STABLE
复制
这为您提供了从一开始的所有提交REL_15_STABLE
,除了已经包含在 REL_14_STABLE
. 这实际上是所有内容, REL_15_STABLE
因为它是从REL_14_STABLE
. 显示的最后一次提交将是“让黑客开始”的提交。
上面的内容也可以写成这种等价的、更熟悉的形式:
git log REL_14_STABLE..REL_15_STABLE
复制
现在,git log
也有一个三点形式:
git log REL_14_STABLE...REL_15_STABLE
复制
根据其文档,这相当于
git log REL_14_STABLE REL_15_STABLE --not $(git merge-base --all REL_14_STABLE REL_15_STABLE)
复制
这是
git log REL_14_STABLE REL_15_STABLE ^e1c1c30f635390b6a3ae4993e8cac213a33e6e3f
复制
REL_14_STABLE
这将为您提供与上面提到的相同的提交混合列表REL_15_STABLE
,但它将停止在分支点而不是回到时间的开始。不知道什么时候有用。
所以,总结一下:
git diff
: 使用三个dotsgit log
: 使用两个dots
或者采用我原来的方法:当两个点不能给你正确的答案时使用三个点(反之亦然)。
原文标题:git diff and git log and dots
原文作者:Peter Eisentraut
原文链接:http://peter.eisentraut.org/blog/2022/09/13/git-diff-and-git-log-and-dots