Day20|【Git】介绍分支观念与切换分支指令动作

上篇介绍关於分支的常用指令,那麽这篇让我们好好了解分支是什麽吧!

分享我最初听到「分支」时,我的理解是:

在原有的支线上,另辟一条新的支线,然後把内容移过去,之後新增的 Commit 都会在这分支上,当分支移除後 Commit 也跟着删除,整个动作都着重在分支的变化影响 Commit 的去留,而不是 Commit 本身的内容,其实这是一个错误的理解喔!或许看到这里你会觉得我在鬼打墙?绕口令?反而更加对分支毫无头绪。

没关系!我们可以先记住一个观念,它将会贯穿之後介绍分支时每个动作的原理。

✏️ 分支只是一个指向某个 Commit 的指标,即使删除分支,也不会影响 Commit 的内容。

分支只是一个「指标」

在 Git 的世界里,分支并不是透过复制得到相同的目录跟档案後进行修改,修改完毕後再合并把更新之後的档案放回原本的目录。

其实分支只是方便让我们了解现在的档案是跟原本的流程分开,不受其他分支影响,他就是一个「指标」,告诉我们现在所在位子,而不会影响内容本身。

也许我们可以把分支想像成路线名称牌号,而 HEAD 想像成自己的定位系统 ...

分支 - 路线名称指标

HEAD - 定位指摽(当前所在位子)

看看分支的与 Commit 之间的关系变化|

简单的一个分支情境:

  1. Commit / master / HEAD 基本关系

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010qu21S8ZlVJ.png

    HEAD 现在在 master 支线上

  2. 假设新增了一次新的 Commit 之後,新的 Commit 会指向前一个 Commit

    https://ithelp.ithome.com.tw/upload/images/20211002/201410108P8uYH72WK.png

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010GAc0nYRHCY.png

    想像我们现在抵达下一站 Commit ,这个 Commit 位於 master 分支路线上,而我们 HEAD 也表示我们在 master 这条支线。

    新增的 Commit 指向前一个 Commit 之後,HEAD 与 mater 同时跟着前进。

多个分支情境:

  1. 在原先的 Commit 上透过指令又多了一个新的分支。

    $ git branch one # 新增一个 one 分支
    

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010uqt3P0wKrh.png

    将此 Commit 多新增一个路线指标给它,此时会有 master 与 one 两个分支同时贴在同个 Commit 上。

  2. 执行切换分支指令到 one 分支,此时 HEAD 也会跟着换成 one 分支。

    $ git checkout one # 切换到 one 分支上
    

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010usVFggtKf1.png

    依照比喻可以想像成我们准备在同一个 Commit 站上,要走向 one 指标路线,HEAD 告诉我们现在在哪个分支上。

  3. 接着我们在 one 的分支上,又新增一个 Commit,此时这个新的 Commit 会指向前一个 Commit。

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010LmTQiwJK2e.png

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010HYZ41Wr8u3.png

    小提醒: HEAD 通常会指向最新的 Commit

看完上述范例,应该对分支有点概念了吧?接下来就让我们了解,当我们切换分支时,有什麽事情变化呢?

当我们切换分支时, Git 做了两件事:

  1. 更新暂存区以及工作目录
  2. 变更 HEAD 的位置

更新暂存区以及工作目录 |

当 Git 切换分支时,会从当前的 Commit 的内容来「更新」暂存区以及工作目录。

范例:

  1. 假设我在 one 分支上新增了 hello1.html 、 hello2.html 两个档案,那麽此时 commit 的内容会拿来更新暂存区与工作目录。

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010Vchv5afFbi.png

  2. 後续 commit 提交後,又新增了 hello3.html 档案,并再提交一次,总共提交了两次。

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010DoUUXDipYY.png

    两次 Commit 的 SHA-1 值分别是:4f18d8b 、 dba939f

  3. 查看一下 Git 纪录:

    $ git log --oneline # 查看纪录
    

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010Fk7WUX7YpV.png

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010GixEcyhArC.png

    可以看到 one 分支比 master 分支多了两次 commit 纪录。

    按下 q 按键,即可退回原画面。

  4. 接着查看一下在 one 分支的时候,档案列表会长怎麽样:

    https://ithelp.ithome.com.tw/upload/images/20211002/2014101092K4uonlr4.png

    可以看到先前两次新增的三个档案都有在内。此时的工作目录:

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010nbuxRTZXfl.png

  5. 改切回 master 分支,并查看档案列表:

    $ git checkout master # 切换到 master 分支
    $ ls -al # 查看档案列表
    

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010baoRAYu3oV.png

    切回 master 分支後,此时 master 分支的 Commit 并没有先前的三个档案。

    这时的工作目录:

    https://ithelp.ithome.com.tw/upload/images/20211002/20141010uWA6qKFFNx.png

    档案不见了吗?并不是唷!它依然存在,只是在 one 分支上而已,只要切回 one 分支後,档案就会再出现了。

    https://ithelp.ithome.com.tw/upload/images/20211002/201410102eZp8FP3dk.png

从上面的范例操作,试着思考当我们切换到 master 分支的时候,one 分支 commit 的东西从本地端的工作目录上画面不见了,这样是代表被删掉了吗?

答案是没有的,他依然会存在工作目录上,即使我们切回 master 分支,先前所做的 commit 更新会留在工作目录不被受影响。只是在 master 分支上的 Commit 的工作目录并没有这个内容的存在。

👉 观念:切换分支之前的修改依然会留在工作目录,不受影响。

补充复习:在 Git 世界里, 每新增一次 Commit 就相当新增一个物件,而他会指向某个 Tree 物件(目录)。

变更 HEAD 的位置 |

先前的范例可以发现,当我们切换分支时,HEAD 也会跟着移动,指向当前的 Commit。这个动作同时也会修改 .git/HEAD 中的档案。


总结:
Git 切换分支的时候,会使用此分支所指向的 Commit 来更新暂存区与工作目录。即使切换分支後,先前的修改动作依然会留在工作目录中,不被受影响。


<<:  【设计+切版30天实作】|Day20 - Navigation bar - 打破预设的navbar排版

>>:  DAY19:进阶清单元件之实作

[JS] You Don't Know JavaScript [this & Object Prototypes] - Prototypes [上]

前言 我们在Object [上]与Object [下]中多次提到[[Prototype]],但是都没...

Day 8 | 比较漂亮的清单-客制化Adapter

Adapter客制化 当需要图文并茂时,就需要客制化Adapter。 建立资料 data class...

Leetcode/AlgoExpert 解题笔记 – Array 篇 (1)

嗨大家好,这系列的文章主要是想纪录我在写 Leetcode / AlgoExpert 的题目时的一些...

解决AVADA主题网站LOGO忽大忽小闪烁的问题

AVADA是一个非常划算的WordPress主题,因为只要us$60,可以使用+更新一辈子,对於新手...

Day9 PHP数据类型--基本类型之字串

字串(String) 字串(String)就是一连串的字元 先来看字串简单介绍吧~ <?php...