13-git-9-相对引用

概述

通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。

使用相对引用的话,你就可以从一个易于记忆的地方(比如bugFix 分支或 HEAD)开始计算。

分类

操作符~

HEAD 表示当前分支的最新提交

HEAD~ 表示当前分支的最新提交的前一个提交(即最新的第二个提交,也就是最新提交的父提交)

HEAD~~ 表示当前分支的最新提交的前前提交(即最新的第三个提交,也就是最新提交的祖父提交)

HEAD~~~ 表示当前分支的最新提交的前前前提交(即最新的第四个提交,也就是最新提交的曾祖父提交)

HEAD~~~等效于HEAD~3

HEAD~~等效于HEAD~2

HEAD等效于HEAD1

HEAD等效于HEAD~0

操作符^

单个直系父提交

把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。

方式一

main^ 相当于“main 的父节点”。

main^^main 的第二个父节点

方式二

我们也可以多次使用 HEAD^ 向上移动。

git checkout HEAD^
git checkout HEAD^

多个直系父提交

假如当前提交不只一个父节点,有多个直系父提交呢?

如果一个提交有多个父提交,那么 ~ 只会找第一个父提交。

使用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

混合链式调用

git checkout HEAD~^2~2

选择直系父节点的 第二个父节点的 直系第二个父节点

应用

强制修改分支位置

使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交。例如:

git branch -f main HEAD~3
git branch -f dev c2

相对引用为我们提供了一种简洁的引用提交记录 的方式, 而 -f 则容许我们将分支强制移动到那个位置。