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

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

開發 前端
Tag 和 branch 類似,也是指向某個 commit 的指針。不同的是 tag 創建后其指向的 commit 不能變化,而 branch 創建后,其指針會在提交新的 commit 后向前移動。

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

Git 目錄結構

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

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

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

其目錄結構如下:

圖片圖片

待會我們重點關注下這幾個目錄:

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

Git 三大對象

目前 Objects 目錄中還沒有任何內容,我們創建一個文件并提交:

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

圖片圖片

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

圖片圖片

這一大串是什么?

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

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

我們挨個看下:

065bca(blob):

圖片圖片

3b18e(blob):

圖片圖片

824244(tree):

圖片圖片

c5bc98(commit):

圖片圖片

ca96(tree):

圖片圖片

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

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

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

這幾個對象的對應關系如下圖所示:

圖片圖片

Git Brach 和 Tag

現在來看下 HEAD 中的內容,前面說過,HEAD 中存儲的是工作目錄當前狀態對應的 commit:

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

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

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

我們切一個新分支 feat/work:

圖片圖片

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

圖片圖片

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

從上面的實驗可以看出,一個 branch 其實只是一個 commit 對象的應用,Git 并不會為每個 branch 存儲一份拷貝,因此在 git 中創建 branch 幾乎沒有任何代價。

接下來我們在 feat/work 這個 branch上進行一些修改,然后提交:

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

圖片圖片

查看當前的 HEAD:

圖片圖片

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

查看 8a442 這個commit對象的內容:

圖片圖片

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

圖片圖片

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

增加了這次 commit 后,Git 中各個對象的關系如下圖所示:

圖片圖片

Tag 和 branch 類似,也是指向某個 commit 的指針。不同的是 tag 創建后其指向的 commit 不能變化,而 branch 創建后,其指針會在提交新的 commit 后向前移動。

責任編輯:武曉燕 來源: 飛天小牛肉
相關推薦

2023-08-27 21:41:14

Git文件系統版本

2024-08-30 08:50:00

2021-04-20 13:59:37

云計算

2020-06-30 10:45:28

Web開發工具

2020-06-29 07:42:20

邊緣計算云計算技術

2020-08-17 17:20:36

pythonJAVA代碼

2024-01-12 07:38:38

AQS原理JUC

2024-05-16 11:13:16

Helm工具release

2019-03-28 08:39:47

5GNSASA

2009-11-09 12:55:43

WCF事務

2024-12-18 10:24:59

代理技術JDK動態代理

2022-02-24 10:28:23

物聯網

2022-02-17 09:24:11

TypeScript編程語言javaScrip

2024-01-16 07:46:14

FutureTask接口用法

2023-12-27 08:15:47

Java虛擬線程

2013-06-28 14:30:26

棱鏡計劃棱鏡棱鏡監控項目

2020-10-29 08:28:42

Java NIO異步非阻塞

2019-12-04 18:45:00

華為Mate X

2021-12-17 07:47:37

IT風險框架

2024-07-05 09:31:37

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 影音av | 69精品久久久久久 | 国产一区二区三区在线 | 成人精品视频免费 | 国产一区二区久久久 | 91高清在线观看 | 国产精品久久久久久久久久久久久久 | 亚洲另类视频 | 欧美91| 精品国产免费一区二区三区演员表 | 国产女人精品视频 | 欧美精产国品一二三区 | 国产精品波多野结衣 | 伦理午夜电影免费观看 | 久久99这里只有精品 | 涩涩视频网| 在线视频一区二区三区 | 国产精品自拍视频 | 婷婷久久久久 | 亚洲影视在线 | av一级久久 | av中文字幕在线播放 | 国产成人小视频 | 国产91丝袜 | 一级毛片视频免费观看 | 久久久久久亚洲精品 | 成人欧美一区二区三区视频xxx | 欧美日一区二区 | 欧洲高清转码区一二区 | 欧美色欧美亚洲另类七区 | 国产一区二区三区在线免费 | 久久久性色精品国产免费观看 | 草草草影院 | 欧美亚洲国语精品一区二区 | 最新中文字幕在线播放 | 99久久婷婷国产综合精品电影 | 亚洲天堂日韩精品 | 91免费电影 | 国产精品国产精品国产专区不蜜 | 亚洲一区二区三区在线播放 | 日韩精品视频网 |