当我在Git中指定一个祖先提交对象时,我混淆了HEAD^和HEAD~。
两者都有“编号”版本,如HEAD^3和HEAD~2。
在我看来它们非常相似或相同,但是波浪号和插入符号之间有什么不同吗?
当我在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