git波浪号与脱字符的区别

在 git 中我们常常会见到波浪号 ~ 与脱字符(或者叫插入符)^ 两个符号,例如 get reset --hard HEAD~2git 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,故不存在;

参考资料

Git 中的 ~ 和 ^

git 中 HEAD^和 HEAD~区别

Git 中的 HEAD ^和 HEAD?有什么区别?

git-rev-parse