指定哈希与相对引用
指定hash
通过指定提交记录哈希值的方式在 Git 中移动不太方便。
用 git log 来查查看提交记录的哈希值。哈希值在真实的 Git 世界中也会更长(基于 SHA-1,共 40 位)。可以仅输入fed2 而不是 fed2da64c0efc5293610bdd892f82a58e8cbc5d8一长串字符。
通过哈希值指定提交记录很不方便,所以 Git 引入了相对引用。使用相对引用的话,你就可以从一个易于记忆的地方(比如 bugFix 分支或 HEAD)开始计算。
- 使用
^向上移动 1 个提交记录 - 使用
~<num>向上移动多个提交记录,如~3
相对引用
操作符 ^
把这个符号加在引用名称的后面,表示让 Git 寻找指定提交记录的父提交。所以 master^ 相当于“master 的父节点”。master^^ 是 master 的第二个父节点
现在咱们切换到 master 的父节点
1 | git checkout master^ |

1 | git checkout C3 |

切换到 bugFix 的父节点。这会进入分离 HEAD 状态。
1 | git checkout bugFix^ |
“~”操作符
如果你想在提交树中向上移动很多步的话,敲那么多 ^ 貌似也挺烦人的,Git 当然也考虑到了这一点,于是又引入了操作符 ~。
该操作符后面可以跟一个数字(可选,不跟数字时与 ^ 相同,向上移动一次),指定向上移动多少次。
1 | git checkout HEAD~4 |
强制修改分支位置 -f
使用相对引用最多的就是移动分支。可以直接使用 -f 选项让分支指向另一个提交:

1 | git branch -f master HEAD~3 |
上面的命令会将 master 分支强制指向 HEAD 的第 3 级父提交。

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


1 | git checkout c6 |
随意移动到对应的位置去创建分支
但是该操作符后面的数字与 ~ 后面的不同,并不是用来指定向上返回几代,而是指定合并提交记录的某个父提交。还记得前面提到过的一个合并提交有两个父提交吧,所以遇到这样的节点时该选择哪条路径就不是很清晰了。
Git 默认选择合并提交的“第一个”父提交,在操作符 ^ 后跟一个数字可以改变这一默认行为。
这里有一个合并提交记录。如果不加数字修改符直接checkout master^,会回到第一个父提交记录。(在我们的图示中,第一个父提交记录是指合并提交记录正上方的那个提交记录。)
1 | checkout master^ |


1 | checkout master^2 |

使用 ^ 和 ~ 可以自由地在提交树中移动,非常给力
1 | git checkout HEAD~ # c6 |


or
1 | git checkout HEAD~^2~2 |
在对应位置创建新的分支
1 | git branch newFeature HEAD~^2~2 |