为什么与^的合并提交反转差异!父母符号

时间:2017-07-31 06:38:39

标签: git diff parent notation

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

来自Other ^ Parent Shorthand Notations

  

r1^!表示法包含提交r1但不包括其所有父项。   这个表示法本身表示单个提交r1

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

$ git diff <commit>^!

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

$ git diff <merge-commit>^!

我得到difftool的类似结果。

为什么会这样?

1 个答案:

答案 0 :(得分:1)

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

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

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

这里它适用于合并提交:

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

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

相关(但不完全相同):What is the difference between `git diff topic1 topic2 ^master` and `git diff topic1..topic2 ^master`?