git diff HEAD^ HEAD
或git diff HEAD~ HEAD
与此git diff HEAD^1
或git diff HEAD~1
之间的区别是什么?
我理解那些git diff HEAD^ HEAD
= git diff HEAD~ HEAD
。
所以git diff HEAD^1
= git diff HEAD~1
..
所有这些在任何情况下都产生相同的输出吗?
答案 0 :(得分:4)
我认为主要的混淆不是关于git diff
,而关于HEAD
和HEAD^[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 link和this link,详细了解HEAD
相关内容。
下图显示了在非常简单的情况下使用Ancestry References的几种方法。
PS。对以前的错误答案表示诚挚的道歉,并且非常感谢@torek纠正它。
答案 1 :(得分:4)
您的示例不相同。如果您没有指定要进行比较的提交,那么diff将包含工作树更改,是否已暂存。
因此,git diff HEAD^
将在提交中包含工作树更改,而git diff HEAD^ HEAD
将不包括工作树更改,并且仅包括两次提交之间的差异。
HEAD^
,HEAD~
,HEAD^1
和HEAD~1
都是相同的。它们都引用HEAD
提交的第一个父。
HEAD^^
,HEAD~~
和HEAD~2
相同,它们都引用HEAD
提交的第一个父级的第一个父级。 HEAD^2
是特殊的 - 它引用HEAD
提交的第二个父级,仅在HEAD
是合并提交时才有用。
此处提供更多信息: