当前位置:首页 > 科技  > 软件

三分钟上手!一文看懂 Git 的底层工作原理

来源: 责编: 时间:2023-08-20 23:17:10 719观看
导读这是一篇能让你迅速了解 Git 工作原理的文章,实战案例解析,相信我,3 分钟,绝对能够有收获!Git 目录结构Git 的本质是一个文件系统(很重要,记住这句话,理解这句话),工作目录中的所有文件的历史版本以及提交记录(commit)都是以文件

这是一篇能让你迅速了解 Git 工作原理的文章,实战案例解析,相信我,3 分钟,绝对能够有收获!zbo28资讯网——每日最新资讯28at.com

Git 目录结构

Git 的本质是一个文件系统(很重要,记住这句话,理解这句话),工作目录中的所有文件的历史版本以及提交记录(commit)都是以文件对象的方式保存在 .git 目录中的。zbo28资讯网——每日最新资讯28at.com

我们先来创建一个名为 git-demo 空目录,并采用 git init 命令初始化 Git 仓库。该命令会在工作目录下生成一个 .git 目录,该目录将用于保存工作区中所有的文件历史的历史版本,commit,branch,tag 等所有信息。zbo28资讯网——每日最新资讯28at.com

$ mkdir git-demo$ cd git-demo$ git init

其目录结构如下:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

待会我们重点关注下这几个目录:zbo28资讯网——每日最新资讯28at.com

  • HEAD:工作目录当前状态对应的 commit,一般来说是当前 branch 的 head,HEAD 也可以通过 git checkout 命令被直接设置到一个特定的 commit 上,这种情况被称之为 detached HEAD
  • objects:这里是真正保存 Git 对象的目录,包括三类对象 commit,tree 和 blob(具体这三类对象是什么,慢慢往下看就知道了)
  • refs:用来保存 branch 和 tag 对应的 commit

Git 三大对象

目前 Objects 目录中还没有任何内容,我们创建一个文件并提交:zbo28资讯网——每日最新资讯28at.com

$ git:(master) echo "my project" > README$ git:(master) mkdir src$ git:(master) echo "hello world" > src/file1.txt

添加并提交:zbo28资讯网——每日最新资讯28at.com

$ git:(master) git add .$ git:(master) git commit -m "init commit"

图片图片zbo28资讯网——每日最新资讯28at.com

从打印输出可以看到,上面的命令创建了一个 commit 对象,该 commit 包含两个文件。查看 .git/objects 目录,可以看到该目录下增加了 5 个子目录 06,3b, 82, c5, ca,每个子目录下有一个以一长串字母数字命令的文件:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

这一大串是什么?zbo28资讯网——每日最新资讯28at.com

Git Object 目录中存储了三种对象:Commit, Tree 和 Blob,Git 会为对象生成一个文件,并根据文件信息生成一个 SHA-1 哈希值作为文件内容的校验和,创建以该校验和前两个字符为名称的子目录,并以 (校验和) 剩下 38 个字符为文件命名 ,将该文件保存至子目录下。zbo28资讯网——每日最新资讯28at.com

可以通过 git cat-file -t 哈希值 命令查看对象类型,通过 git cat-file -p 哈希值 命令查看对象中的内容,哈希值就是目录名+文件名,在没有歧义的情况下,命令可以不用输入整个哈希值,输入前几位即可。zbo28资讯网——每日最新资讯28at.com

我们挨个看下:zbo28资讯网——每日最新资讯28at.com

065bca(blob):zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

3b18e(blob):zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

824244(tree):zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

c5bc98(commit):zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

ca96(tree):zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

认真看图,大家看完也就差不多清楚了 commit、blob、tree 这几大对象是什么东西了zbo28资讯网——每日最新资讯28at.com

从 commit 对象(c5bc98)入手,commit 对象中保存了 commit 的作者,commit 的描述信息,签名信息以及该 commit 中包含哪些 tree 对象和 blob 对象。从上图可知包含了 tree 对象(ca96)。zbo28资讯网——每日最新资讯28at.com

可以把 tree 对象看成这次提交相关的所有文件的根目录,可以看到 ca96 这个 tree 对象中包含了一个 blob 对象(065bca),即 README 文件,以及一个 tree 对象(824244),即 src 目录。而 blob 对象存储的就是真正的内容。zbo28资讯网——每日最新资讯28at.com

这几个对象的对应关系如下图所示:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

Git Brach 和 Tag

现在来看下 HEAD 中的内容,前面说过,HEAD 中存储的是工作目录当前状态对应的 commit:zbo28资讯网——每日最新资讯28at.com

$ git:(master) cat .git/HEADref: refs/heads/master
$ git:(master) cat .git/refs/heads/masterc5bc98b8990bedd7444da537320559e601eba87b

c5bc98 正是我们最近的这次 commit!zbo28资讯网——每日最新资讯28at.com

master 是一个分支名,所以分支(branch)的本质是一个指向 commit 的指针zbo28资讯网——每日最新资讯28at.com

我们切一个新分支 feat/work:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

查看下 refs/heads/master 和 refs/heads/feat/work 中的 commit 值:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

从其内容可以看到,feat/work 这个 branch 并没有创建任何新的版本文件,和 master 一样指向了 c5bc98 这个 commit。zbo28资讯网——每日最新资讯28at.com

从上面的实验可以看出,一个 branch 其实只是一个 commit 对象的应用,Git 并不会为每个 branch 存储一份拷贝,因此在 git 中创建 branch 几乎没有任何代价。zbo28资讯网——每日最新资讯28at.com

接下来我们在 feat/work 这个 branch上进行一些修改,然后提交:zbo28资讯网——每日最新资讯28at.com

$ git:(feat/work) echo "new line" >> src/file1.txt$ git:(feat/work) echo "do nothing" >> License$ git:(feat/work) git add .$ git:(feat/work) git commit -m "some change"

图片图片zbo28资讯网——每日最新资讯28at.com

查看当前的 HEAD:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

可以看到 HEAD 指向了 feat/work 这个 branch,而 feat/work branch则指向了 8a442 这个commit,master branch 指向的 commit 未变化,仍然是 c5bc98。zbo28资讯网——每日最新资讯28at.com

查看 8a442 这个commit对象的内容:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

可以看到 commit 有一个 parent 字段,指向了前一个 commit c5bc98。还包含了一个 tree 对象(2a9dd):zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

可以观察到,由于 README 没有变化,还是指向的 065bca 这个blob对象。License 是一个新建的 blob 对象,src 和 file1.txt 则指向了新版本的对象。zbo28资讯网——每日最新资讯28at.com

增加了这次 commit 后,Git 中各个对象的关系如下图所示:zbo28资讯网——每日最新资讯28at.com

图片图片zbo28资讯网——每日最新资讯28at.com

Tag 和 branch 类似,也是指向某个 commit 的指针。不同的是 tag 创建后其指向的 commit 不能变化,而 branch 创建后,其指针会在提交新的 commit 后向前移动。zbo28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-6179-0.html三分钟上手!一文看懂 Git 的底层工作原理

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 最新技术趋势:RabbitMQ在云原生应用中的应用

下一篇: GitHub和码云上,七个H5页面制作工具推荐

标签:
  • 热门焦点
  • 5月安卓手机好评榜:魅族20 Pro夺冠

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年5月1日至5月31日,仅限国内市场。第一名:魅族20 Pro好评率:97.50%不得不感慨魅族老品牌还
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 十个可以手动编写的 JavaScript 数组 API

    JavaScript 中有很多API,使用得当,会很方便,省力不少。 你知道它的原理吗? 今天这篇文章,我们将对它们进行一次小总结。现在开始吧。1.forEach()forEach()用于遍历数组接收一参
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 使用Webdriver-manager解决浏览器与驱动不匹配所带来自动化无法执行的问题

    1、前言在我们使用 Selenium 进行 UI 自动化测试时,常常会因为浏览器驱动与浏览器版本不匹配,而导致自动化测试无法执行,需要手动去下载对应的驱动版本,并替换原有的驱动,可能还
  • 电视息屏休眠仍有网络上传 爱奇艺被质疑“薅消费者羊毛”

    记者丨宁晓敏 见习生丨汗青出品丨鳌头财经(theSankei) 前不久,爱奇艺发布了一份亮眼的一季报,不仅营收和会员营收创造历史最佳表现,其运营利润也连续6个月实现增长。自去年年初
  • 荣耀Magicbook V 14 2021曙光蓝版本正式开售,拥有触摸屏

    荣耀 Magicbook V 14 2021 曙光蓝版本正式开售,搭载 i7-11390H 处理器与 MX450 显卡,配备 16GB 内存与 512GB SSD,重 1.48kg,厚 14.5mm,具有 1.5mm 键盘键程、
Top