Git diff HEAD和HEAD~的区别

3
我在查找如何在工作树和最后一次提交之间进行差异比较时,找到了Stackoverflow上的这个被接受的答案。
可以有人解释一下HEAD和HEAD~实际上是指什么吗?因为这并没有在答案中得到解释,而我也无法从谷歌上搞明白 :)

enter image description here

谢谢。
1个回答

5

首先,实际回答最初的需求:“我正在寻找如何在工作目录和上次提交之间进行差异比较”

您只需要

git diff HEAD

(对大多数命令,HEAD都是默认的,但diff略有不同,是的git diffgit diff HEAD是不同的)


现在,HEADHEAD~之间的区别非常简单:

HEAD是Git用来表示当前正在操作的状态的指针,通常是一个分支。(见词汇表)

~ 表示被指定提交的父提交。因此,HEAD~ 的意思是“不是最后一次提交,而是前一个提交”

有这样的树形结构:

---> time direction this way --->

A---B---C <<< master <<< HEAD

HEAD 会指向提交 C,而 HEAD~ 则会指向 B


编辑以澄清关于 HEAD^

HEAD^HEAD~ 都指向(如果我们按照示例)B,但这不应让你误认为它们是相同的。

<someCommit>^N(其中如果未明确给出,则 N=1)表示当指定的提交有多个父项时该提交的第 N 个父项。对于经典的两个父项合并,如果 HEAD 指向合并提交,则可以通过 HEAD^HEAD^2 找到父项。

<someCommit>~N(同样,默认为 N=1),则意味着所述提交的第 N 个祖先,即在过去回溯 N 次,每次仅跟随一个父项。为了更好地说明,在我们的示例中,HEAD~2 将指代 A


啊,谢谢,我以为HEAD^是用来干什么的,现在我知道它是指上一个提交和父提交了。顺便说一下,你说的是'git diff',但是根据图表,'git diff'是在工作目录和暂存区之间进行比较,而不是最后一次提交。 - Neil Walker
@NeilWalker 哈哈,轮到我感谢你了;-) 我回答得太匆忙了,但你是对的。正在编辑。我还会添加关于 HEAD^ 的部分。 - Romain Valeri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接