概述
通过哈希值指定提交记录很不方便,所以 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
则容许我们将分支强制移动到那个位置。