git波浪号与脱字符的区别
在 git 中我们常常会见到波浪号 ~
与脱字符(或者叫插入符)^
两个符号,例如 get reset --hard HEAD~2
或 git reset --hard HEAD^2
,那么这两个符号有什么区别呢?
结论
波浪号
~
是指第几代祖先提交;脱字符
^
是指第几个父提交;这两个符号可以混合使用;
例子
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
说明
波浪号(~)
<rev>~<n>
指 rev 提交的第 n 代祖先提交。
A~0
第 0 代祖先提交,即 A 本身;A~
与A~1
等价,指第一代祖先,即父提交;当同一祖先层级有多个提交时,
~
都指向当前层级左起第一个提交,例如A~
是指 B 而不是 C,A~2
指 D 而不是 E 或 F;A~~~
与A~3
表示相同的意义,即 A 的第三代祖先提交;
脱字符,也叫插入符(^)
<rev>~<n>
指 rev 提交的第 n 个父提交。
A^0
第 0 个父提交,即 A 本身;A^
与A^1
等价 同时也与A~
、A~1
等价,指第一个父提交;^
对父提交的指向也是从左算起,如A^
指 B,A^2
指 C;A^^^
与A^3
含义不同,A^^^
相当于A^1^1^1
的缩写,指 A 的父的父的父,与A~3
相同,即指 G。而A^3
则指 A 的第 3 个父提交,A 只有两个父提交 B、C,故不存在;
参考资料