我们git diff之间有什么不同的方式?

时间:2014-01-26 05:57:27

标签: git git-diff

git diff HEAD^ HEADgit diff HEAD~ HEAD与此git diff HEAD^1git diff HEAD~1之间的区别是什么?

我理解那些git diff HEAD^ HEAD = git diff HEAD~ HEAD

所以git diff HEAD^1 = git diff HEAD~1 ..

所有这些在任何情况下都产生相同的输出吗?

2 个答案:

答案 0 :(得分:4)

我认为主要的混淆不是关于git diff,而关于HEADHEAD^[num]以及HEAD~[num]

修改

HEAD表示您正在处理的当前分支。

HEAD^[num]表示多父节点的第num个父点。对于单个父节点,[Commit] ^ [2或更大]是无效表达式。 (并且git会通过fatal: ambiguous argument '1f9a20d^2': unknown revision or path not in the working tree.

警告这一点

HEAD~[num]表示提交节点的第num个次提交。对于合并节点,ancester是合并时所在的分支分支。

参考this linkthis link,详细了解HEAD相关内容。

下图显示了在非常简单的情况下使用Ancestry References的几种方法。 Ancestry-References

PS。对以前的错误答案表示诚挚的道歉,并且非常感谢@torek纠正它。

答案 1 :(得分:4)

您的示例不相同。如果您没有指定要进行比较的提交,那么diff将包含工作树更改,是否已暂存。

因此,git diff HEAD^将在提交中包含工作树更改,而git diff HEAD^ HEAD将不包括工作树更改,并且仅包括两次提交之间的差异。

HEAD^HEAD~HEAD^1HEAD~1都是相同的。它们都引用HEAD提交的第一个父。

HEAD^^HEAD~~HEAD~2相同,它们都引用HEAD提交的第一个父级的第一个父级。 HEAD^2是特殊的 - 它引用HEAD提交的第二个父级,仅在HEAD是合并提交时才有用。

此处提供更多信息:

http://git-scm.com/book/ch6-1.html#Ancestry-References