'git log' 与 'git log tag..' 不匹配

'git log' does not match up with 'git log tag..'

我一直认为 'git log' 是所有真理的来源,真实地按时间顺序展示事物。但是我 运行 与 git 日志范围选项相矛盾。我相信 'tag..' 选项会在我所在的特定分支上为我提供标签和 HEAD 之间的所有内容。

比如我用git log --oneline --decorate得到

df43779 (HEAD -> myBranch) commit o
5aeb672 commit n
34cc390 (tag: myTag) commit k
060e7ee commit i
7b6607a commit f
08a3fea commit d
467aea3 commit b
aa4c5dd commit a

而且我希望当我这样做时 git log myTag.. --oneline --decorate 我会得到

af43779 (HEAD -> myBranch) commit o
5aeb672 commit n

但是,当我 运行 git log myTag.. --oneline --decorate 时,我得到的是:

df43779 (HEAD -> myBranch) commit o
5aeb672 commit n
060e7ee commit i
08a3fea commit d

假设 git log 说的是实话,我的范围命令可能会给我超出我指定的提交范围的提交的一些原因是什么?

我知道更多信息可能有助于具体回答这个问题,例如提交时间和分支复杂性的信息。但我想我真正想知道的是更理论化的:git 日志是否按真正的时间顺序显示内容,还是不像看起来那么简单? 'tag..' 选项是否做了我对它做了什么的简单解释以外的事情?这些示例与我想象的不匹配的原因有哪些?

换句话说,"true log" 是什么日志,为什么?

git log myTag..真的是git log myTag..HEAD。它要求所有可从 HEAD 访问的提交,不包括 可从 myTag 访问的提交。这回答了问题 "what have I done since myTag?" 请参阅 gitrevisions "Dotted Range Notations".

on 很明显,它们在 myTag 之后。但是为什么id好像在myTag之前呢?仅从您的 git log 很难知道。 git log 呈现了历史的线性视图,但 Git 历史不是线性的。分支是真实的,提交可以通过多种方式连接。

默认情况下,git log 反向时间顺序 呈现历史记录,同时确保 parents 和 children 也在正确的位置命令。您必须 运行 git log --graph 才能看到真正的联系。养成使用它的习惯,或者像 tig 这样的 Git 日志可视化工具。

这是发生这种情况的一种方式...

        o HEAD
        |
        n
        |\
  myTag k |
        | i
        f |
        | d
        |/
        b
        |
        a

reverse-date 订单仍然是 o-n-k-i-f-d-b-a,但现在我们看到在 b 处创建了一个分支并在 n 处合并。 myTag 看不到它前面的 o-n,但它也看不到另一个分支中的 i-dmyTagHEAD 的历史在 b 一起返回。所以 git log myTag..HEAD 给你 o-n-i-d.