第五章、高级用法

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 的提交对象。

提交对象位置的写法

  1. 使用提交哈希值表示具体的提交对象。
    • 长哈希值,如:11caedf3fd3c82f930421ee319bebab3c5822abe
    • 短哈希值,如:11caedf
  2. 使用 HEAD 表示当前位置。
  3. 使用 HEAD^n 表示当前提交对象的第 n 个父对象(合并前的第 n 个提交对象)。
    • 如:HEAD^1 等同于 HEAD^ 表示 11caedf 的第一个父对象 9d3b213
    • 如:HEAD^2 表示 11caedf 的第二个父对象 8e7f7c7(因为 11caedf 是由两个对象合并得到的,因此它有两个父对象)。
    • 如:HEAD^2^1 表示 11caedf 的第二个父对象 8e7f7c7 的第一个父对象 5dcccb0
  4. 使用 HEAD~HEAD~n 表示当前分支上的第 n 个父对象。
    • 如:HEAD~1 等同于 HEAD~ 表示 11caedf 的第一个父对象 9d3b213
    • 如:HEAD~2 等同于 HEAD~~ 表示 11caedf 的父对象 9d3b213的父对象 5dcccb0

示例:

以使用 git restore 恢复项目 my_project 的工作区为例:

  1. git restore --source=HEAD . 等同于 git restore --source=11caedf .git restore .
  2. git restore --source=HEAD~ .git restore --source=HEAD~1 . 等同于 git restore --source=9d3b213 .
  3. git restore --source=HEAD^2 . 等同于 git restore --source=8e7f7c7 .
  4. 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 指针将工作区的文件恢复到任意一个提交时的状态。