调用git diff时,提交散列后的插入符号(^!)会做什么?

调用git diff时,提交散列后的插入符号(^!)会做什么?,git,Git,查看(的git扩展)的源代码,我看到^(插入符号bang)被追加到提交哈希。见: 函数getDiffOfFileFromCommit(散列,文件){ 返回git([“diff”、“--no ext diff”、“--no color”、hash+“^!”、“--”文件]; } 这将在命令行上转换为以下内容,以相关文件为例: $git diff--无外部差异--无颜色1f9ea6e^--src/git/GitCli.js 我知道^将引用提交的父级。什么是^执行?提交^是一个范围说明符,它的意思

查看(的git扩展)的源代码,我看到
^git diff
时,代码>(插入符号bang)被追加到提交哈希。见:

函数getDiffOfFileFromCommit(散列,文件){ 返回git([“diff”、“--no ext diff”、“--no color”、hash+“^!”、“--”文件]; }
这将在命令行上转换为以下内容,以相关文件为例:

$git diff--无外部差异--无颜色1f9ea6e^--src/git/GitCli.js

我知道
^
将引用提交的父级。什么是
^执行?

提交^
是一个范围说明符,它的意思是:此提交,但没有其父级。 这相当于指定:
commit^parent1^parent2^parentN

对于diff,这没有意义(您只能比较两棵树) 通过测试,该命令似乎显示了父级的合并基与最后一个父级之间的差异。我认为git(mis)解释的参数类似于范围
A…B
,它将显示
merge base A B
B
之间的差异(
git diff parent1…parent2
将产生相同的差异)。不确定在八达通合并的情况下会发生什么


不过,我可能错了,这些只是我从使用存储库测试和查看git代码(
builtin/diff.c
)中得出的假设。

有一个很好的指南,介绍了在文档中引用提交的各种方法。对本例感兴趣的是,我相信:“r1^!包括commit r1,但排除其所有父级。”从测试中,输出似乎与调用diff相同,commit及其所有父级都是参数。我不知道git在区分多个树时做了什么(从代码注释来看,这应该是一个错误)。也许它对父对象的合并基有一些魔力?“r1^@表示法意味着r1的所有父对象。r1^!包括提交r1,但不包括其所有父对象。”@maartencls:是的,我知道–请参阅我答案的第一句话。对于
git diff
,范围实际上没有意义,因为它只能用于端点。特别是这个范围(提交,但没有其父级)不能保证有两个端点,所以git得到confused@maartencls很高兴知道。我总是用。我希望这两个页面是同步的。@knittl:for和普通的非合并提交
A^
A^..A
,这对于diff来说相当于“
A^A
”@JakubNarębski,谢谢。你的评论是正确的答案。