目录

Git 中的 ~ 和 ^

优质
小牛编辑
131浏览
2023-12-01

原文链接:scarletsky 的 blog

~ 的作用

在查询 commit 编号的时候,一般会执行以下操作:

git log --graph --oneline

* 90055c5 update 2016年12月30日 星期五 18时34分58秒 CST
* 031b9f2 Update README.md
* 71b62a9 Update README.md
* 8f17f7e Update README.md
...
(END)

然后选择某个提交,在进行下一步操作。但是如果目的提交为近期提交的话,可以使用 ~ 来直接获得提交记录。例如:

git rev-parse HEAD
90055c5125fe54312c47098f9533ef64a9f5c52b

git rev-parse HEAD~1
031b9f2e6806b9616035dadf5ba9f32c715e5f74

git rev-parse HEAD~
031b9f2e6806b9616035dadf5ba9f32c715e5f74

可以看到 ~1~ 是等效的,也就是说一个 ~ 符号,代表提交记录前移一位。

但是, git 是存在多分支的,如果本次提交的上一次提交有多个的时候, ~ 只能查找到第一个父提交,录入下图:

$ git log --graph --oneline
* f44239d D
*   7a3fb3d C
|\
| * 07b920c B
|/
* 71bd2cf A
...

在这个图中,我们无法通过 ~ 来找到 07b920c (B) 这个提交。针对于这种情况,引入了 ^ 标记。找到 07b920c (B) 方法是使用 HEAD~^2

<rev>^<n> 用来表示一个提交的第 n 个父提交,如果不指定 n,那么默认为 1。和 ~ 不同的是,HEAD^^^ 等价于 HEAD^1^1^1 ,而不是 HEAD^3。因为没多一个符号,默认的就向父层询问,描述的不是同级关系。

最后给一张好玩的图,来自 Jon Loeliger 的 kernel.org:

G   H   I   J
 \ /     \ /
  D   E   F
   \  |  / \
    \ | /   |
     \|/    |
      B     C
       \   /
        \ /
         A
A =      = A^0
B = A^   = A^1     = A~1
C = A^2  = 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