为什么使用 ^! 父表示法的合并提交的差异是相反的



为什么^!反转合并提交的差异?

从其他 ^ 父速记符号

r1^!表示法包括提交r1,但不包括其所有父项。 就其本身而言,此表示法表示单个提交r1

这正确地向我显示了非合并提交的差异。

$ git diff <commit>^!

但是对于合并提交,差异是相反的。

$ git diff <merge-commit>^!

我得到difftool类似的结果.

为什么会这样?

简短的回答是它是一个错误。

您可以使用git rev-parse查看git diff有效看到的内容。 以下是应用于普通提交的^!后缀:

$ git rev-parse 699d47e1d^!
699d47e1d2777ad1c2a867671e35daa821769f29
^4aaf5b0b21ac1fc294066593ac5243b3eaff897b

在这里,它应用于合并提交:

$ git rev-parse 117ddefdb^!
117ddefdb4dfd9b40ae60967a7327754d8ce7a87
^5e5a7cd9327cdbe6b50b5a0ead9b2ee5fb30789c
^699d47e1d2777ad1c2a867671e35daa821769f29

当你向git diff提供压缩符号时,Git 会通过git rev-parse使用的相同扩展代码传递它。 但是,git diff没有将其打印出来,而是尝试反向解释结果。 如果有两个提交哈希(带有各种标志(,它会在两个命名提交之间运行差异。 如果有三个或更多,它会做一些不同的事情。

相关(但不完全相同(:'git diff topic1 topic2 ^master' 和 'git diff topic1..主题2 ^主人'?

最新更新