暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL :git diff 和 git log 和dots

原创 Bigbig 2022-10-17
305

不久前,我们有几个 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_STABLEREL_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: 使用三个dots
  • git 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

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论