为什么diff与^!合并提交反转?父母表示法

问题描述:

为什么^!会颠倒合并提交的差异?为什么diff与^!合并提交反转?父母表示法

Other^Parent Shorthand Notations

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不是将其打印出来,而是试图回溯解释结果。如果有两个提交散列(具有各种标志),它将在两个命名的提交之间运行差异。如果有三个或更多,它会做一些不同的事情。

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

+0

有没有解决的eta?只是好奇。 – hIpPy

+0

我不认为任何人都在意足以使这项工作。在另一方面,他们可能会认为这是一个特点:如果他们把我的修为其他问题,你风与合并差异,你用'混帐show'得到相同的一个。 – torek

+0

老实说,我认为'commit ^!'是完美的,至少可以从文档中区分出合并。 'commit〜commit'用于提交和合并,但我觉得合并的直观性较差。 – hIpPy