当我在Git中指定一个祖先提交对象时,我混淆了HEAD^和HEAD~。

两者都有“编号”版本,如HEAD^3和HEAD~2。

在我看来它们非常相似或相同,但是波浪号和插入符号之间有什么不同吗?


当前回答

~表示父母。

^如果它有两个或更多的父节点,比如合并提交。我们可以选择父节点中的第二个或另一个。

如果只有一个东西,比如(HEAD~或HEAD^),结果是一样的。

其他回答

TLDR

~是你大多数时候想要的,它引用过去提交到当前分支

^引用父节点(git-merge创建第二个或更多父节点)

A~总是等于A^ A~~总是和A^^一样,以此类推 A~2并不等于A^2, 因为~2是~~的缩写 虽然^2不是任何东西的缩写,但它意味着第二个父元素

HEAD^^^与HEAD~3相同,选择HEAD之前的第三次提交

HEAD^2指定合并提交中的第二个头

HEAD~指定“分支”上的第一个父节点。 HEAD^允许你选择一个特定的提交父节点

一个例子:

如果你想要遵循一个分支,你必须指定像这样的东西

master~209^2~15

以下是从http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde上逐字逐句摘录的一个很好的解释:

Ref ~是Ref ~1的简写,表示提交的第一个父对象。Ref ~2表示提交的第一个父对象的第一个父对象。Ref ~3表示提交的第一个父级的第一个父级的第一个父级。等等。 Ref ^是Ref ^1的简写,表示提交的第一个父对象。但两者的不同之处在于ref^2表示提交的第二个父对象(记住,当提交是一个merge时,它们可以有两个父对象)。 ^和~操作符可以组合使用。

OP:当我在Git中指定一个祖先提交对象时,我混淆了HEAD^和HEAD~。

Git中的HEAD^和HEAD~有什么区别?

HEAD^(插入号)和HEAD~(波浪号)之间的区别在于它们如何从指定的起点向后遍历历史,在这种特殊情况下是HEAD。

波浪号~

<rev>~[<n>] = select <n>第一代祖先

插入符号 ^

<rev>^[<n>] = select <n>第一代祖先的第一个父母

*第一个父节点总是在merge的左边,例如,在被合并到的分支上提交。

把~和^连在一起

如下图所示,两个选择器~和^可以组合使用。还要注意,不使用HEAD作为起点,任何常规引用都可以使用,比如分支、标记甚至是提交散列。

此外,根据要选择的祖先,^和~可以互换使用,如下表所示。

来源:在这篇关于这个主题的博客文章中可以找到一个完整的纲要。