2014-09-03 93 views
5

通过查看brackets-git(用于Brackets的git扩展)的源代码,我看到在调用git diff时,^!(插入符号)正被追加到提交哈希。见GitCli.js, line 754在调用git diff时,提交hash后做了什么?(^!)?

function getDiffOfFileFromCommit(hash, file) { 
    return git(["diff", "--no-ext-diff", "--no-color", hash + "^!", "--", file]); 
} 

这相当于在命令行下,使用有问题的文件为例:

$ git diff --no-ext-diff --no-color 1f9ea6e^! -- src/git/GitCli.js 

我知道^要提到的提交的父。 ^!做什么?

+3

对于[git rev-parse](http://git-scm.com/docs/git-rev-parse)文档中提到的所有提交方式,都有很好的指导。在这种情况下,我相信:“r1 ^!包含提交r1但排除其所有父母。” – Charlie 2014-09-03 18:57:27

+0

从测试中,输出似乎与调用差异并将其所有父项作为参数完全相同。我不知道在分析多个树时(从代码注释,它应该是一个错误)什么git做。也许它与父母的合并基础有一些魔力? – knittl 2014-09-03 19:59:32

回答

5

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

对于差异这没有任何意义(您只能比较两棵树) 从测试该命令似乎显示父母的合并基础和最后一个父母之间的差异。我认为git(mis)解释类似于范围A...B的参数,这将显示merge-base A BBgit diff parent1...parent2将产生相同的差异)之间的差异。不知道在章鱼合并的情况下会发生什么。

虽然我可能是错的,但这些只是我从测试存储库中抽取的一些假设,并查看了git代码(builtin/diff.c)。

+1

事实上,它的记录在这里:http://git-scm.com/docs/git-rev-parse – maartencls 2014-09-03 20:16:12

+0

“r1^@符号表示r1的所有父母。** r1 ^!包含提交r1但排除其所有的父母。**“ – maartencls 2014-09-03 20:16:53

+0

@maartencls:是的,我知道 - 见我答案的第一句话。范围对'git diff'没有意义,因为它只能用于端点。这个范围(承诺,但没有父母)特别是不能保证有正好两个端点,所以混帐得到混淆 – knittl 2014-09-04 05:34:43

相关问题