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

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

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


当前回答

^<n>格式允许您选择提交的第n个父节点(与合并相关)。~<n>格式允许您选择第n个祖先提交,始终紧跟在第一个父提交之后。有关一些示例,请参阅git-rev-parse的文档。

其他回答

简单地说:

~指定祖先 ^指定父母

合并时可以指定一个或多个分支。然后提交有两个或多个父节点,然后^用于表示父节点。

假设你在分支A上,还有两个分支:B和C。

在每个分支上的最后三个提交是:

A: a1, a2, a3 B: b1 b2 b3 C: c1 c3 c3

如果现在在分支A上执行命令:

git merge B C

然后你将三个分支合并在一起(这里你的合并提交有三个父分支)

and

~表示第一个分支中的第n个祖先,因此

HEAD~表示A3 HEAD~2表示A2 HEAD~3表示A1

^表示第n个父结点,因此

HEAD^表示A3 HEAD^2表示B3 HEAD^3表示C3

~或^的下一个用法是在前面的字符指定的提交上下文中。

注意1:

HEAD~3总是等于:HEAD~~~和:HEAD^^^(每个表示A1),

和一般:

HEAD~n总是等于:HEAD~…~ (n次~)和to: HEAD^…^ (n乘以^)

注意2:

HEAD^3和HEAD^^^不一样(第一个表示C3,第二个表示A1),

和一般:

HEAD^1和HEAD^是一样的, 但是对于n > 1: HEAD^n总是不等于HEAD^…^ (n乘以^)

~表示父母。

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

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

^ BRANCH选择器 git结帐头^2 通过移动到所选分支(在提交树上后退一步),选择(合并)提交的第二个分支。

~提交选择器 git结帐头~2 在默认/选择的分支上向后提交2次


将~和^相对引用定义为PARENT选择器是迄今为止我在互联网上看到的主要定义——包括官方的Git Book。是的,它们是PARENT选择器,但这种“解释”的问题是,它完全违背了我们的目标:如何区分两者……:)

另一个问题是当我们被鼓励使用^ BRANCH选择器进行COMMIT选择时(也就是HEAD^ === HEAD~)。 同样,是的,你可以这样使用它,但这不是它的设计目的。^ BRANCH选择器的向后移动行为是一个副作用,而不是它的目的。

只有在合并提交时,才可以将数字分配给^ BRANCH选择器。因此,只有在需要在分支机构之间进行选择时,才能充分利用其容量。 在fork中表达选择的最直接的方法是踏上所选的路径/分支——这是在提交树上后退一步。这只是一种副作用,而不是它的主要目的。

我的意见…

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

一个例子:

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

master~209^2~15