"show me all logs from HEAD to ec9cb4106" 的命令是什么?

What is the command for "show me all logs from HEAD to ec9cb4106"?

我需要查看 (1) 从 HEAD 到 ec9cb4106 的日志消息或 (2) 从 HEAD 到 ec9cb4106 的汇总差异。 revision selection 页面似乎没有讨论它,我无法让 git 接受明显的选择:

$ git log HEAD .. ec9cb4106
fatal: ec9cb4106: no such path in the working tree.
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

$ git diff HEAD .. ec9cb4106
fatal: ec9cb4106: no such path in the working tree.
Use 'git <command> -- <path>...' to specify paths that do not exist locally.

我正在尝试 X .. Y,因为这是 git 在总结更新时显示的内容,并且可以将其提供给 git diff

如何查看 (1) 范围内的日志消息,或 (2) 范围的汇总差异?

git lo HEAD..ec9cb4106git log ^HEAD ec9cb4106 列出可从 ec9cb4106 访问的所有提交,不包括可从 HEAD 访问的提交。如果 HEAD 位于 ec9cb4106 之前或仅指向 ex9cb4106,则输出为空。您可能需要 git log ec9cb4106..HEADgit log ^ec9cb4106 HEAD.git diff HEAD ec9cb4106git diff HEAD..ec9cb4106git diff ec9cb4106 HEADgit diff ec9cb4106..HEADgit diff ec9cb4106(HEAD 可以省略这种情况)都是一样的。

格式化为答案(并且更关心顺序):你想要 git log ec9cb4106..HEAD 这里(根据评论),即包括可从 HEAD 到达的提交但排除可从 [=14 到达的项目=](包括 ec9cb4106 本身)。

注意两个点前后没有空格。

two-dot 表示法是 shorthand for inclusion-and-exclusion。

一般来说,像 git loggit rev-list select 这样的命令是一个提交 "with ancestry",就像这样:接受给定的提交并找到它的 parent (s)、parents' parents 等等,并访问每个这样的提交。这可能是一组非常大的提交,因此我们需要一些方法来删除提交图中不感兴趣的部分。

为此,git loggit rev-list可以进行集合运算。一般来说,命名多个提交会让你成为一个联合。例如,考虑这样的图表:

     C--D   <-- branch1
    /
A--B
    \
     E--F   <-- branch2

命名 branch1 select 提交 D,它通过 back-pointers 到达提交 CBA,因此向您展示了这四个提交。

命名 branch2 selects 提交 F,它到达提交 EBA,因此向您展示那些 四次提交。

命名 both 分支 selects both D and F,所以你看到所有六个提交。请注意,您不会两次看到BA:selection首先完成,收集所有要显示的提交,然后提交被排序并显示(每个一次)。

删除 图表的某些部分,您可以告诉 revision-walker 从某个提交开始并删除该提交及其所有祖先。这个的外部语法是前缀 hat ^:

git log branch1 ^branch2

这表示 "select everything reachable from branch1, then discard everything reachable from branch2"。在这种情况下,那就是 select D、C、B 和 A;然后丢弃 F、E、B 和 A。F 和 E 不是 in 原始集合,但这不是问题:您可以减去不存在的提交。因此,否定的提交实际上不需要在 positively-selected 提交的祖先集合中。

Git 为这些提供了相当多的语法集,所以除了 ^X Y,你还可以写 --not X --not Y。两个--not的原因是--not坚持--not X Y表示^X ^Y。第二个 --not 抵消了第一个。

two-dot 语法,X..Y,对于 ^X Y 是 shorthand(或等效的(Y ^X)。除了 --not 坚持, 使用较长的语法时顺序无关紧要,但对于 two-dot 语法很重要。

请注意 git diff 对 two-dot 语法进行特殊处理。 它不会 select 那里的提交范围。 (git diff 的 C 源代码相对较早地检查文字字符串 ..,如果存在则将其删除,然后再将参数传递给修订解析代码。)