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

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

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


当前回答

如果你想知道在你的命令中是输入HEAD^还是HEAD~,那就随便用:

它们都是同一个提交的名称——当前提交的第一个父文件。

master~和master^ -也是如此,这两个名字都是master的第一个父元素。

就像2 + 2和2 * 2都是4一样,它们是不同的方式,但答案是一样的。

这回答了一个问题:Git中HEAD^和HEAD~之间有什么区别?

如果你只是做了一个合并(所以你当前的提交有一个以上的父),或者你仍然对插入号和波浪号的工作原理感兴趣,请参阅其他答案(我不会在这里重复)以获得深入的解释,以及如何重复使用它们(例如head ~~~),或与数字一起使用(例如head ^2)。否则,我希望这个答案能帮你节省一些时间。

其他回答

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

一个例子:

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

master~209^2~15

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

~和^本身都是指提交的父节点(~~和^^都是指祖父节点提交,等等),但当它们与数字一起使用时,它们的含义有所不同:

~2表示在层次结构中向上两层,如果一个提交有多个父级,则通过第一个父级 ^2表示第二个父节点,其中提交有多个父节点(也就是说,因为它是一个merge)

这些可以组合起来,所以HEAD~2^3意味着HEAD的祖父提交的第三个父提交。

HEAD~和HEAD^之间区别的一个实际例子:

简单地说:

~指定祖先 ^指定父母

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

假设你在分支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乘以^)