成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

開發(fā) 前端
Git 的本質(zhì)是一個(gè)文件系統(tǒng)(很重要,記住這句話,理解這句話),工作目錄中的所有文件的歷史版本以及提交記錄(commit)都是以文件對(duì)象的方式保存在 .git 目錄中的。

這是一篇能讓你迅速了解 Git 工作原理的文章,實(shí)戰(zhàn)案例解析,相信我,3 分鐘,絕對(duì)能夠有收獲!

Git 目錄結(jié)構(gòu)

Git 的本質(zhì)是一個(gè)文件系統(tǒng)(很重要,記住這句話,理解這句話),工作目錄中的所有文件的歷史版本以及提交記錄(commit)都是以文件對(duì)象的方式保存在 .git 目錄中的。

我們先來創(chuàng)建一個(gè)名為 git-demo 空目錄,并采用 git init 命令初始化 Git 倉庫。該命令會(huì)在工作目錄下生成一個(gè) .git 目錄,該目錄將用于保存工作區(qū)中所有的文件歷史的歷史版本,commit,branch,tag 等所有信息。

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

其目錄結(jié)構(gòu)如下:

圖片圖片

待會(huì)我們重點(diǎn)關(guān)注下這幾個(gè)目錄:

  • HEAD:工作目錄當(dāng)前狀態(tài)對(duì)應(yīng)的 commit,一般來說是當(dāng)前 branch 的 head,HEAD 也可以通過 git checkout 命令被直接設(shè)置到一個(gè)特定的 commit 上,這種情況被稱之為 detached HEAD
  • objects:這里是真正保存 Git 對(duì)象的目錄,包括三類對(duì)象 commit,tree 和 blob(具體這三類對(duì)象是什么,慢慢往下看就知道了)
  • refs:用來保存 branch 和 tag 對(duì)應(yīng)的 commit

Git 三大對(duì)象

目前 Objects 目錄中還沒有任何內(nèi)容,我們創(chuàng)建一個(gè)文件并提交:

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

添加并提交:

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

圖片圖片

從打印輸出可以看到,上面的命令創(chuàng)建了一個(gè) commit 對(duì)象,該 commit 包含兩個(gè)文件。查看 .git/objects 目錄,可以看到該目錄下增加了 5 個(gè)子目錄 06,3b, 82, c5, ca,每個(gè)子目錄下有一個(gè)以一長串字母數(shù)字命令的文件:

圖片圖片

這一大串是什么?

Git Object 目錄中存儲(chǔ)了三種對(duì)象:Commit, Tree 和 Blob,Git 會(huì)為對(duì)象生成一個(gè)文件,并根據(jù)文件信息生成一個(gè) SHA-1 哈希值作為文件內(nèi)容的校驗(yàn)和,創(chuàng)建以該校驗(yàn)和前兩個(gè)字符為名稱的子目錄,并以 (校驗(yàn)和) 剩下 38 個(gè)字符為文件命名 ,將該文件保存至子目錄下。

可以通過 git cat-file -t 哈希值 命令查看對(duì)象類型,通過 git cat-file -p 哈希值 命令查看對(duì)象中的內(nèi)容,哈希值就是目錄名+文件名,在沒有歧義的情況下,命令可以不用輸入整個(gè)哈希值,輸入前幾位即可。

我們挨個(gè)看下:

065bca(blob):

圖片圖片

3b18e(blob):

圖片圖片

824244(tree):

圖片圖片

c5bc98(commit):

圖片圖片

ca96(tree):

圖片圖片

認(rèn)真看圖,大家看完也就差不多清楚了 commit、blob、tree 這幾大對(duì)象是什么東西了

從 commit 對(duì)象(c5bc98)入手,commit 對(duì)象中保存了 commit 的作者,commit 的描述信息,簽名信息以及該 commit 中包含哪些 tree 對(duì)象和 blob 對(duì)象。從上圖可知包含了 tree 對(duì)象(ca96)。

可以把 tree 對(duì)象看成這次提交相關(guān)的所有文件的根目錄,可以看到 ca96 這個(gè) tree 對(duì)象中包含了一個(gè) blob 對(duì)象(065bca),即 README 文件,以及一個(gè) tree 對(duì)象(824244),即 src 目錄。而 blob 對(duì)象存儲(chǔ)的就是真正的內(nèi)容。

這幾個(gè)對(duì)象的對(duì)應(yīng)關(guān)系如下圖所示:

圖片圖片

Git Brach 和 Tag

現(xiàn)在來看下 HEAD 中的內(nèi)容,前面說過,HEAD 中存儲(chǔ)的是工作目錄當(dāng)前狀態(tài)對(duì)應(yīng)的 commit:

$ git:(master) cat .git/HEAD
ref: refs/heads/master
$ git:(master) cat .git/refs/heads/master
c5bc98b8990bedd7444da537320559e601eba87b

c5bc98 正是我們最近的這次 commit!

master 是一個(gè)分支名,所以分支(branch)的本質(zhì)是一個(gè)指向 commit 的指針

我們切一個(gè)新分支 feat/work:

圖片圖片

查看下 refs/heads/master 和 refs/heads/feat/work 中的 commit 值:

圖片圖片

從其內(nèi)容可以看到,feat/work 這個(gè) branch 并沒有創(chuàng)建任何新的版本文件,和 master 一樣指向了 c5bc98 這個(gè) commit。

從上面的實(shí)驗(yàn)可以看出,一個(gè) branch 其實(shí)只是一個(gè) commit 對(duì)象的應(yīng)用,Git 并不會(huì)為每個(gè) branch 存儲(chǔ)一份拷貝,因此在 git 中創(chuàng)建 branch 幾乎沒有任何代價(jià)。

接下來我們在 feat/work 這個(gè) branch上進(jìn)行一些修改,然后提交:

$ 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"

圖片圖片

查看當(dāng)前的 HEAD:

圖片圖片

可以看到 HEAD 指向了 feat/work 這個(gè) branch,而 feat/work branch則指向了 8a442 這個(gè)commit,master branch 指向的 commit 未變化,仍然是 c5bc98。

查看 8a442 這個(gè)commit對(duì)象的內(nèi)容:

圖片圖片

可以看到 commit 有一個(gè) parent 字段,指向了前一個(gè) commit c5bc98。還包含了一個(gè) tree 對(duì)象(2a9dd):

圖片圖片

可以觀察到,由于 README 沒有變化,還是指向的 065bca 這個(gè)blob對(duì)象。License 是一個(gè)新建的 blob 對(duì)象,src 和 file1.txt 則指向了新版本的對(duì)象。

增加了這次 commit 后,Git 中各個(gè)對(duì)象的關(guān)系如下圖所示:

圖片圖片

Tag 和 branch 類似,也是指向某個(gè) commit 的指針。不同的是 tag 創(chuàng)建后其指向的 commit 不能變化,而 branch 創(chuàng)建后,其指針會(huì)在提交新的 commit 后向前移動(dòng)。

責(zé)任編輯:武曉燕 來源: 飛天小牛肉
相關(guān)推薦

2023-08-15 08:46:30

Git指針移動(dòng)

2020-06-30 10:45:28

Web開發(fā)工具

2024-08-30 08:50:00

2021-04-20 13:59:37

云計(jì)算

2020-06-29 07:42:20

邊緣計(jì)算云計(jì)算技術(shù)

2020-08-17 17:20:36

pythonJAVA代碼

2024-01-12 07:38:38

AQS原理JUC

2019-03-28 08:39:47

5GNSASA

2009-11-09 12:55:43

WCF事務(wù)

2024-12-18 10:24:59

代理技術(shù)JDK動(dòng)態(tài)代理

2024-05-16 11:13:16

Helm工具release

2022-02-24 10:28:23

物聯(lián)網(wǎng)

2013-06-28 14:30:26

棱鏡計(jì)劃棱鏡棱鏡監(jiān)控項(xiàng)目

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2023-12-27 08:15:47

Java虛擬線程

2024-01-16 07:46:14

FutureTask接口用法

2019-12-04 18:45:00

華為Mate X

2020-10-29 08:28:42

Java NIO異步非阻塞

2025-02-24 10:40:55

2021-12-17 07:47:37

IT風(fēng)險(xiǎn)框架
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 一区二区三区在线播放 | 日本免费视频在线观看 | 国产成人精品a视频 | 欧美一区二区三区视频在线观看 | 中国一级特黄真人毛片 | 日韩一区二区三区在线视频 | 在线观看日韩av | 午夜视频免费 | 午夜电影网| 久久久久久中文字幕 | 日屁网站 | 一区二区三区国产精品 | 国产在线视频一区二区 | 美国黄色一级片 | h视频免费在线观看 | 欧美一级网站 | 国产免费看| 亚洲毛片在线观看 | 国产黄色一级片 | 国产日韩精品一区 | www.激情.com | 国产欧美日韩综合精品一 | 欧美国产日韩一区二区三区 | 亚洲一区 中文字幕 | 亚洲欧美一区二区三区国产精品 | tube国产| 精品久久一区 | 久久伦理电影 | 午夜精品91 | 欧美日韩国产精品一区 | 91资源在线播放 | 国产 日韩 欧美 在线 | 91热在线 | 日韩精品久久久久 | 国产高清精品一区二区三区 | 欧美成人h版在线观看 | 好好的日在线视频 | 日本三级电影免费 | 国产精品1区2区3区 中文字幕一区二区三区四区 | 久久99精品久久久久蜜桃tv | 日韩视频a|