第五章、高级用法
1. HEAD 指针
在 Git 版本控制系统中总有一个指向当前操作位置的 HEAD 指针,这个指针指向当前分支的分支指针。
这里以之前 经过两个分支合并后的 my_project 项目的仓库为例。此时 HEAD 指向 master, 而 master 指向 11caedf,即如果再有提交,则提交到 11caedf 提交对象之后。其分支结构如下所示:
HEAD
|
.--------.
| master |
`--------`
|
+-------+ +-------+ +-------+ +-------+
|8cb34d1| <-- |5dcccb0| <-- |9d3b213| <-- |11caedf|
+-------+ +-------+ +-------+ +-------+
^ |
| +-------+ <----+
`-------- |8e7f7c7|
+-------+
|
.--------.
| myb1 |
`--------`
默认情况下 HEAD 代表当前分支的最后提交对象。我们使用 HEAD 可以取出提交对象的快照。
在使用 git restore 命令恢复工作区时可以使用 --source=<提交对象> 恢复指定提交对象带边的工作区。这个提交对象也可以用 HEAD 或相对于 HEAD 的提交对象。
提交对象位置的写法
- 使用提交哈希值表示具体的提交对象。
- 长哈希值,如:
11caedf3fd3c82f930421ee319bebab3c5822abe - 短哈希值,如:
11caedf
- 长哈希值,如:
- 使用
HEAD表示当前位置。 - 使用
HEAD^n表示当前提交对象的第 n 个父对象(合并前的第 n 个提交对象)。- 如:
HEAD^1等同于HEAD^表示11caedf的第一个父对象9d3b213 - 如:
HEAD^2表示11caedf的第二个父对象8e7f7c7(因为11caedf是由两个对象合并得到的,因此它有两个父对象)。 - 如:
HEAD^2^1表示11caedf的第二个父对象8e7f7c7的第一个父对象5dcccb0。
- 如:
- 使用
HEAD~或HEAD~n表示当前分支上的第 n 个父对象。- 如:
HEAD~1等同于HEAD~表示11caedf的第一个父对象9d3b213。 - 如:
HEAD~2等同于HEAD~~表示11caedf的父对象9d3b213的父对象5dcccb0。
- 如:
示例:
以使用 git restore 恢复项目 my_project 的工作区为例:
git restore --source=HEAD .等同于git restore --source=11caedf .和git restore .git restore --source=HEAD~ .或git restore --source=HEAD~1 .等同于git restore --source=9d3b213 .git restore --source=HEAD^2 .等同于git restore --source=8e7f7c7 .git restore --source=HEAD~3 .等同于git restore --source=8cb34d1 .
执行后的效果如下:
weimingze@mzstudio:~/my_project$ ls
README.md function1.txt function2.txt website.txt
weimingze@mzstudio:~/my_project$ git restore --source=HEAD~ .
weimingze@mzstudio:~/my_project$ ls
README.md function2.txt website.txt
weimingze@mzstudio:~/my_project$ git restore --source=HEAD^2 .
weimingze@mzstudio:~/my_project$ ls
README.md function1.txt website.txt
weimingze@mzstudio:~/my_project$ git restore --source=HEAD~3 .
weimingze@mzstudio:~/my_project$ ls
README.md
练习:
在 my_project 项目中使用 HEAD 指针将工作区的文件恢复到任意一个提交时的状态。