Day16|什麽是 HEAD ?

在先前的章节里,我们可以常看见 HEAD 这个名词,它指的是什麽呢?

// git 恢复文件到初始状态
$ git reset HEAD <file>

// git 展示提交命令
$ git log
commit c4f9d71863ab78cfca754c78e9f0f2bf66a2bd77 (HEAD -> master)
(SHA-1 记得改成自己的)

这篇就让我们好好了解 HEAD 吧!


什麽是 HEAD ?

HEAD 指的是一个指标,指向当前所在的分支 。

分支其实是个指向 commit 对象的指针,用来记录不同的工作变动,如 masterdevelop 分支,因此我们如何知道当前是在哪个分支上操作的呢?

其实就是使用 HEAD 档案来记录的哦!HEAD 是一个特别指针,在 Git 中,指向你正在工作中的本地分支的指针,因此通常我们也可以把 HEAD 看作 「目前所在分支」,也就是当前分支的别名。

https://ithelp.ithome.com.tw/upload/images/20210930/20141010u0Ablk8NRi.png

.git 目录里可以找到 HEAD 档案。

HEAD 档案里面是什麽呢?我们可以输入指令来查看。

$ cat .git/HEAD  # 显示 .git 目录里的 HEAD 档案内容
//cat <file>  是 Linux 档案管理指令

https://ithelp.ithome.com.tw/upload/images/20210930/20141010PUoLmjn61f.png

得到的回馈是:ref: refs/heads/master

ref 同 References ,「引用」之意。从回馈的讯息中,可以看出目前 HEAD 正指向某个分支,我们可以继续查看 refs/heads/master 的内容。

$ cat .git/refs/heads/master # 显示 .git/refs/heads/master 的内容

https://ithelp.ithome.com.tw/upload/images/20210930/201410100uPHlpeFNP.png

回馈显示:f926dd97ae8a3c25176d8ce1268c37a8d8753eb3

这 40 个字元代表的是什麽呢?是 SHA-1 值,每一次提交一个版本就会有代表的 SHA-1 值。

以上输入指令的步骤,我们也可从画面中查看。

  1. 找到 .git 目录下的 HEAD 档案

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010Ha747vxSqe.png

  2. 点开 HEAD 档案显示内容

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010AWjU0tsAO6.png

  3. 根据内容找到 refs 目录,并持续打开里面的内容,找到 master 档案

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010t2W8qmNv6q.png

  4. 点开 master 档案,查看内容

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010t42azFHl53.png


HEAD 指向范例

上面我们有提到 HEAD 档案用来记录我们当前的分支在哪里,那接下来我们就透过实际操作看看 HEAD 的指向吧。

HEAD 可以选择指向到:

  1. 分支(Branch)

  2. commit 版本

  3. 输入以下指令,完成提交动作

    // 在 git_practice 资料夹底下
    $ mkdir project # 新建一个 project 目录
    $ cd project # 将工作目录切换到 project 目录
    $ git init # 在 project 目录中建立数据库
    $ touch hello.html # 建立一个 hello.html 档案
    $ git add . # 将档案加至暂存区
    $ git status # 检查状态(也可略过)
    $ git commit -m"讯息记录" # 提交至储存库,新增一次 commit 版本
    

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010bhbWuxkbag.png

  4. 输入 git branch 指令,浏览目前分支指向

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010rG7UqTROmu.png

    按 q 键可退出

    回馈显示: * master

    * 代表目前在这个分支上面。master 为目前新增的分支( master 就是我们的预设分支名称)。因此我们可以知道目前在 master 这个分支上。

  5. 查看版本 git log 指令

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010a9GpLzNtha.png

    因为目前我们只提交一次 commit ,因此只有一次的版本纪录。

    此时 HEAD - master - commit 的关系图为:

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010srA4Z6QpPU.png


假设我们今天又多做了几次修改,并 commit 提交版本纪录

https://ithelp.ithome.com.tw/upload/images/20210930/20141010yzdjPUYZWO.png

使用 git log 指令查看历史纪录

https://ithelp.ithome.com.tw/upload/images/20210930/20141010cegkzwfzEH.png

回馈显示我们总共提交了四个 commit ,而 HEAD 指向最後一次的版本,这代表 HEAD 会随着我们每一次新增 Commit 时,都指向最新的版本分支。(HEAD -> master)

注意:历史纪录是最近期的放在最上面,时间由远到近排列为由下而上

此时 HEAD - master - commit 的关系图为:

https://ithelp.ithome.com.tw/upload/images/20210930/201410102pqO46lSO0.png

https://ithelp.ithome.com.tw/upload/images/20210930/201410109GNP0T8JR7.png

状况题|想查看最初的版本

方法:可以透过 HEAD 来指向指定的 commit 版本。

🛠 实际操作

  1. 使用 git log 指令查看历史纪录时,我们可以查到最初的版本(版本一)的 SHA-1 编号。

    https://ithelp.ithome.com.tw/upload/images/20210930/201410100Ce88eeOMe.png

    版本一的 SHA-1 编号前四码为: 0076

  2. 使用 git checkout 指令,切换到指定 commit 版本

    $ git checkout SHA-1编号前四码(识别码) #切换到指定版本
    

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010fW9W7hsFM4.png

    版本切换到最初的版本罗!

    我们可以从工作目录看一下变化:

    https://ithelp.ithome.com.tw/upload/images/20210930/20141010pWSsTjyk9v.png

    https://ithelp.ithome.com.tw/upload/images/20210930/201410103Wu4SrPIsB.png

    补充:即使回到旧的 commit 版本,其他的版本不会因此而不见喔!

状况题|如果想将版本切回现在(最新)的版本呢?

方法:使用 git checkout master 指令

https://ithelp.ithome.com.tw/upload/images/20210930/20141010che62cN2cG.png

输入指令後,重新指向了 master 分支,工作目录中的画面也是当初最後步骤的样子。


上述状况题,我们使用 SHA-1 编码切换到指定版本,其实也可以透过以 HEAD 为起点,跟它相距的版本唷!

各版本之间以 HEAD 为基准点,其他版本的相对位置:

https://ithelp.ithome.com.tw/upload/images/20210930/20141010uTN2vhwGTl.png

^ 符号表示「前一次」,^^ 代表往前两次。~3 盗号加数字可以直接往前推指定数字次数。

使用 HEAD 相对位置来切换版本

$ git checkout HEAD~3 # 切换到三次前的版本

https://ithelp.ithome.com.tw/upload/images/20210930/20141010Yq6eXVG6ww.png

可以看到结果跟上面一样,切换到版本一罗!

因此如果要切回现在(最新版本)的话,一样要输入git checkout master 指令。

https://ithelp.ithome.com.tw/upload/images/20210930/20141010y0Zvbgspzt.png


<<:  第二次参加铁人赛

>>:  Day 15:在生命周期呼喊 API

Day-23 AVL Tree

树的高度(height of the tree) 在Binary Search tree中,我们知道...

【Day 18】Google Apps Script - API 篇 - Spreadsheet Service - 电子试算表服务范例-新增标题

来练习帮 Google Sheets(电子试算表)增加一点内容吧。 今日要点: 》Spreadsh...

【Day 04】LeetCode:Fizz Buzz ( 用 JavaScript 学演算法 )

我们透过 LeetCode #412 Fizz Buzz 来实际感受解决问题的过程 ( 题目连结 )...

Day 18:专案03 - PTT 八卦版爬虫03 | 文章标题、作者、时间

哎呀哎呀,开学後变得好忙阿,连一天写一篇的时间都没有,果然先预留点文章是对的。参赛前还以为30天很短...

< 关於 React: 开始打地基| 图片的使用方式 >

React 图片显示 ?引入图片(svg)-背景图片 只需要将图片放到 public目录下 然后以此...