2

几个月前添加的功能出现了回归。该功能是在三个单独的提交中引入的。为了恢复我想要git cherry-pick的三个提交到分支(rel060)上的功能,该分支是从提交合并到生产之前创建的最后一个标签(release-0.6.0)创建的,由git describe.

这完成了,我想将这个操作的结果与当前生产头上的一个文件的内容进行比较。

git co -b rel060 release-0.6.0
git cherry-pick ead47f2
  [rel060 f28fed4] Corrects non-display of subtabs. (SITE-657)
  1 files changed, 5 insertions(+), 8 deletions(-)
git cherry-pick b22c4d4
  [rel060 b0014f1] Correct subtab bug in Firefox/IE. (SITE-657)
  1 files changed, 18 insertions(+), 24 deletions(-)
git cherry-pick ae5a321
  [rel060 5b41410] Corrects bug with subtab line collapse. (SITE-657)
  1 files changed, 5 insertions(+), 1 deletions(-)
git diff rel060:./cron_lp_functions.php..production:./cron_db_lpgenerate.php
  error: Object 2ce3dd45e32e1bef6da0b22a9ee7208c63e203d2 is a blob, not a commit
  error: Object f41574b41b82aba51876b5f7aba0d3ff9c6677c5 is a blob, not a commit
  fatal: Invalid revision range rel060:./cron_lp_functions.php..production:./cron_db_lpgenerate.php

对于它的价值,尝试在 cron_lp_... 上标记自动完成功能:Not a valid object name rel060:.

functions文件是一个文件,其内容后来被滚动到lpgenerate.

现在,我意识到有一百万种更简单的选择可以做我想做的事情(将三个提交视为一个差异,将释放功能的标签与相关行的当前状态进行差异)。

我想知道的是:为什么我会得到特定的错误?事实证明,摘樱桃似乎与这个问题无关。在从标签创建分支后尝试 diff 会产生相同的错误。我错过了 git 中的一些基本内容吗?从发布中创建一个分支似乎是无害的……有一些我没有注意到的无害的陷阱吗?

4

1 回答 1

2

这样做的原因git diff <commit>..<commit>只是为了保持向后兼容性并且在语法上是“错误的”。

git diff A..B" 一开始就是一个不合逻辑的事情。它只是偶然发生的历史事故,并且出于“它从一开始就这样工作,不要破坏向后兼容性”的原因,我们一直在工作。

但是,当您作为新用户学习 git 时,最好不要学习它以保持理智。

点符号是关于一个范围的。A..B 谈论作为 B 的祖先但不是 A 的祖先的提交集。

$ git log A..B

展示这样的范围是非常有意义的。

但是“差异”是关于“比较两个端点”。这种比较没有任何“范围”。当你比较 A 和 B 的状态时,你甚至没有看中间的任何东西。这就是为什么说它的规范方式是

$ git diff A B

并不是

$ git diff A..B ;# WRONG. DO NOT DO THIS.

和 : 是一种在记录在树中命名实体的方法。通常,您使用此语法命名一个 blob,而不是表示子目录的树。

现在,B1..B2,当 B1 和 B2 是 blob(或任何不提交的东西)时,即使作为一个范围也没有意义,并且这样的请求在句法级别被检测为错误(即甚至没有开始“比较”)。

$ git diff HEAD:Makefile..HEAD~4:Makefile ;# WRONG. DO NOT DO THIS.

如果要比较两个 blob,可以使用规范的“比较两个事物”语法来实现。

$ git diff HEAD:Makefile HEAD~4:Makefile

Junio C. Hamano 的回答,来自 git@vger.kernel.org

于 2012-10-09T21:18:00.947 回答