为什么“ git show HEAD〜”向我显示“ git log”列表中的第三次提交?

时间:2018-08-16 21:15:14

标签: git

我有一个常规提交夹在两个合并提交之间:

commit dc79715411f87e4a4c42c38559ba56ea911a0c01 (HEAD -> master, origin/master, origin/HEAD)
Merge: 097a551 415f5d1
Author: <redacted>
Date:   Tue Aug 14 11:29:54 2018 -0400

    Merge pull request #119 from <redacted>/th-dumb-init

    Use dumb-init instead of phusion

commit 415f5d183dcbf48fb5d27714112308f965438695
Author: <redacted>
Date:   Mon Aug 13 16:13:52 2018 -0400

    Use dumb-init instead of phusion

commit 097a5518087219327ed9f6f3a4499d54a1450cc2
Merge: 9aec35a b63cd1f
Author: <redacted>
Date:   Tue Jul 24 11:01:52 2018 -0400

    Merge pull request #118 from <redacted>/emails_off

    Turn off email alerts for 'orders_populate_every_five_min' Airflow job

运行git show HEAD时,我看到以下内容:

[ sc-airflow ] $ git show HEAD
commit dc79715411f87e4a4c42c38559ba56ea911a0c01 (HEAD -> master, origin/master, origin/HEAD)
Merge: 097a551 415f5d1
Author: <redacted>
Date:   Tue Aug 14 11:29:54 2018 -0400

    Merge pull request #119 from <redacted>/th-dumb-init

    Use dumb-init instead of phusion

这是我所期望的,因为HEAD当前指向SHA dc79715411f87e4a4c42c38559ba56ea911a0c01

但是,当我键入git show HEAD~时,会看到以下内容:

[ sc-airflow ] $ git show HEAD~
commit 097a5518087219327ed9f6f3a4499d54a1450cc2
Merge: 9aec35a b63cd1f
Author: <redacted>
Date:   Tue Jul 24 11:01:52 2018 -0400

    Merge pull request #118 from <redacted>/emails_off

    Turn off email alerts for 'orders_populate_every_five_min' Airflow job

这告诉我HEAD~指向SHA 097a5518087219327ed9f6f3a4499d54a1450cc2。但是,我希望HEAD~引用紧接HEAD或SHA 415f5d183dcbf48fb5d27714112308f965438695之后的提交。为什么不是这种情况?

编辑: 运行git log --graph --all --oneline --decorate显示以下内容:

*   dc79715 (HEAD -> master, origin/master, origin/HEAD) Merge pull request #119 from <redacted>/th-dumb-init
|\  
| * 415f5d1 Use dumb-init instead of phusion
|/  
*   097a551 Merge pull request #118 from <redacted>/emails_off

1 个答案:

答案 0 :(得分:4)

Git的git log命令显示您以某种顺序进行提交。好的,到目前为止,这很明显,但这是棘手的部分:那是什么顺序?

git log显示的第一次提交是合并提交。这意味着它有两个父母。为了方便起见,我们称它们为“妈妈”和“爸爸” :-)。因此,在向您展示了该承诺之后,现在Git将首先向您展示妈妈。也许爸爸先行!它会显示哪一个?默认值为:显示年轻(较新)提交

我们知道HEAD~1是提交097a5518087219327ed9f6f3a4499d54a1450cc2。这是第一个父项,按父项顺序命名,我们将其称为Dad,因为DM之前。但是,按提交日期的顺序,它可能不是第一个 commit 。如果妈妈比爸爸小,git log会在HEAD之后显示妈妈。然后,妈妈有了父母,如果事实证明妈妈的父母比爸爸年轻,Git会向您显示 。只有当爸爸要显示的下一个提交时,它才会显示爸爸。

git log有排序选项,可以告诉它显示哪些提交以及何时显示。不过,最好的办法是,我们也可以同时使用git log --graph--oneline --decorate来使用 commit graph 。后缀^~是图追随者,它们不会查看提交本身的年龄。日志排序会默认查看提交的年龄,但是当您使用--graph时会停止这样做。