当我在Git中指定一个祖先提交对象时,我混淆了HEAD^和HEAD~。
两者都有“编号”版本,如HEAD^3和HEAD~2。
在我看来它们非常相似或相同,但是波浪号和插入符号之间有什么不同吗?
当我在Git中指定一个祖先提交对象时,我混淆了HEAD^和HEAD~。
两者都有“编号”版本,如HEAD^3和HEAD~2。
在我看来它们非常相似或相同,但是波浪号和插入符号之间有什么不同吗?
当前回答
HEAD^和HEAD~之间的区别可以通过http://www.kernel.org/pub/software/scm/git/docs/git-rev-parse.html上的插图(由Jon Loeliger绘制)很好地描述。
这个文档对于初学者来说可能有点晦涩,所以我复制了下面的插图:
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
其他回答
以下是从http://www.paulboxley.com/blog/2011/06/git-caret-and-tilde上逐字逐句摘录的一个很好的解释:
Ref ~是Ref ~1的简写,表示提交的第一个父对象。Ref ~2表示提交的第一个父对象的第一个父对象。Ref ~3表示提交的第一个父级的第一个父级的第一个父级。等等。 Ref ^是Ref ^1的简写,表示提交的第一个父对象。但两者的不同之处在于ref^2表示提交的第二个父对象(记住,当提交是一个merge时,它们可以有两个父对象)。 ^和~操作符可以组合使用。
HEAD^^^与HEAD~3相同,选择HEAD之前的第三次提交
HEAD^2指定合并提交中的第二个头
如果你想知道在你的命令中是输入HEAD^还是HEAD~,那就随便用:
它们都是同一个提交的名称——当前提交的第一个父文件。
master~和master^ -也是如此,这两个名字都是master的第一个父元素。
就像2 + 2和2 * 2都是4一样,它们是不同的方式,但答案是一样的。
这回答了一个问题:Git中HEAD^和HEAD~之间有什么区别?
如果你只是做了一个合并(所以你当前的提交有一个以上的父),或者你仍然对插入号和波浪号的工作原理感兴趣,请参阅其他答案(我不会在这里重复)以获得深入的解释,以及如何重复使用它们(例如head ~~~),或与数字一起使用(例如head ^2)。否则,我希望这个答案能帮你节省一些时间。
TLDR
~是你大多数时候想要的,它引用过去提交到当前分支
^引用父节点(git-merge创建第二个或更多父节点)
A~总是等于A^ A~~总是和A^^一样,以此类推 A~2并不等于A^2, 因为~2是~~的缩写 虽然^2不是任何东西的缩写,但它意味着第二个父元素
^<n>格式允许您选择提交的第n个父节点(与合并相关)。~<n>格式允许您选择第n个祖先提交,始终紧跟在第一个父提交之后。有关一些示例,请参阅git-rev-parse的文档。