上篇介绍关於分支的常用指令,那麽这篇让我们好好了解分支是什麽吧!
分享我最初听到「分支」时,我的理解是:
在原有的支线上,另辟一条新的支线,然後把内容移过去,之後新增的 Commit 都会在这分支上,当分支移除後 Commit 也跟着删除,整个动作都着重在分支的变化影响 Commit 的去留,而不是 Commit 本身的内容,其实这是一个错误的理解喔!或许看到这里你会觉得我在鬼打墙?绕口令?反而更加对分支毫无头绪。
没关系!我们可以先记住一个观念,它将会贯穿之後介绍分支时每个动作的原理。
✏️ 分支只是一个指向某个 Commit 的指标,即使删除分支,也不会影响 Commit 的内容。
在 Git 的世界里,分支并不是透过复制得到相同的目录跟档案後进行修改,修改完毕後再合并把更新之後的档案放回原本的目录。
其实分支只是方便让我们了解现在的档案是跟原本的流程分开,不受其他分支影响,他就是一个「指标」,告诉我们现在所在位子,而不会影响内容本身。
也许我们可以把分支想像成路线名称牌号,而 HEAD 想像成自己的定位系统 ...
分支 - 路线名称指标
HEAD - 定位指摽(当前所在位子)
看看分支的与 Commit 之间的关系变化|
简单的一个分支情境:
Commit / master / HEAD 基本关系
HEAD 现在在 master 支线上
假设新增了一次新的 Commit 之後,新的 Commit 会指向前一个 Commit
想像我们现在抵达下一站 Commit ,这个 Commit 位於 master 分支路线上,而我们 HEAD 也表示我们在 master 这条支线。
新增的 Commit 指向前一个 Commit 之後,HEAD 与 mater 同时跟着前进。
多个分支情境:
在原先的 Commit 上透过指令又多了一个新的分支。
$ git branch one # 新增一个 one 分支
将此 Commit 多新增一个路线指标给它,此时会有 master 与 one 两个分支同时贴在同个 Commit 上。
执行切换分支指令到 one 分支,此时 HEAD 也会跟着换成 one 分支。
$ git checkout one # 切换到 one 分支上
依照比喻可以想像成我们准备在同一个 Commit 站上,要走向 one 指标路线,HEAD 告诉我们现在在哪个分支上。
接着我们在 one 的分支上,又新增一个 Commit,此时这个新的 Commit 会指向前一个 Commit。
小提醒: HEAD 通常会指向最新的 Commit
看完上述范例,应该对分支有点概念了吧?接下来就让我们了解,当我们切换分支时,有什麽事情变化呢?
当我们切换分支时, Git 做了两件事:
更新暂存区以及工作目录 |
当 Git 切换分支时,会从当前的 Commit 的内容来「更新」暂存区以及工作目录。
范例:
假设我在 one 分支上新增了 hello1.html 、 hello2.html 两个档案,那麽此时 commit 的内容会拿来更新暂存区与工作目录。
後续 commit 提交後,又新增了 hello3.html 档案,并再提交一次,总共提交了两次。
两次 Commit 的 SHA-1 值分别是:4f18d8b 、 dba939f
查看一下 Git 纪录:
$ git log --oneline # 查看纪录
可以看到 one 分支比 master 分支多了两次 commit 纪录。
按下
q
按键,即可退回原画面。
接着查看一下在 one 分支的时候,档案列表会长怎麽样:
可以看到先前两次新增的三个档案都有在内。此时的工作目录:
改切回 master 分支,并查看档案列表:
$ git checkout master # 切换到 master 分支
$ ls -al # 查看档案列表
切回 master 分支後,此时 master 分支的 Commit 并没有先前的三个档案。
这时的工作目录:
档案不见了吗?并不是唷!它依然存在,只是在 one 分支上而已,只要切回 one 分支後,档案就会再出现了。
从上面的范例操作,试着思考当我们切换到 master 分支的时候,one 分支 commit 的东西从本地端的工作目录上画面不见了,这样是代表被删掉了吗?
答案是没有的,他依然会存在工作目录上,即使我们切回 master 分支,先前所做的 commit 更新会留在工作目录不被受影响。只是在 master 分支上的 Commit 的工作目录并没有这个内容的存在。
👉 观念:切换分支之前的修改依然会留在工作目录,不受影响。
补充复习:在 Git 世界里, 每新增一次 Commit 就相当新增一个物件,而他会指向某个 Tree 物件(目录)。
变更 HEAD 的位置 |
先前的范例可以发现,当我们切换分支时,HEAD 也会跟着移动,指向当前的 Commit。这个动作同时也会修改 .git/HEAD 中的档案。
总结:
Git 切换分支的时候,会使用此分支所指向的 Commit 来更新暂存区与工作目录。即使切换分支後,先前的修改动作依然会留在工作目录中,不被受影响。
<<: 【设计+切版30天实作】|Day20 - Navigation bar - 打破预设的navbar排版
前言 我们在Object [上]与Object [下]中多次提到[[Prototype]],但是都没...
Adapter客制化 当需要图文并茂时,就需要客制化Adapter。 建立资料 data class...
嗨大家好,这系列的文章主要是想纪录我在写 Leetcode / AlgoExpert 的题目时的一些...
AVADA是一个非常划算的WordPress主题,因为只要us$60,可以使用+更新一辈子,对於新手...
字串(String) 字串(String)就是一连串的字元 先来看字串简单介绍吧~ <?php...