2023-08-15 10:20:59來源:飛天小牛肉
這是一篇能讓你迅速了解 Git 工作原理的文章,實戰(zhàn)案例解析,相信我,3 分鐘,絕對能夠有收獲!
Git 目錄結(jié)構(gòu)Git 的本質(zhì)是一個文件系統(tǒng)(很重要,記住這句話,理解這句話),工作目錄中的所有文件的歷史版本以及提交記錄(commit)都是以文件對象的方式保存在.git目錄中的。
(相關(guān)資料圖)
我們先來創(chuàng)建一個名為 git-demo 空目錄,并采用git init命令初始化 Git 倉庫。該命令會在工作目錄下生成一個.git目錄,該目錄將用于保存工作區(qū)中所有的文件歷史的歷史版本,commit,branch,tag 等所有信息。
$ mkdir git-demo$ cd git-demo$ git init
其目錄結(jié)構(gòu)如下:
圖片
待會我們重點關(guān)注下這幾個目錄:
HEAD:工作目錄當(dāng)前狀態(tài)對應(yīng)的 commit,一般來說是當(dāng)前 branch 的 head,HEAD 也可以通過git checkout命令被直接設(shè)置到一個特定的 commit 上,這種情況被稱之為 detached HEADobjects:這里是真正保存 Git 對象的目錄,包括三類對象 commit,tree 和 blob(具體這三類對象是什么,慢慢往下看就知道了)refs:用來保存 branch 和 tag 對應(yīng)的 commitGit 三大對象目前 Objects 目錄中還沒有任何內(nèi)容,我們創(chuàng)建一個文件并提交:
$ 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)建了一個 commit 對象,該 commit 包含兩個文件。查看.git/objects目錄,可以看到該目錄下增加了 5 個子目錄 06,3b, 82, c5, ca,每個子目錄下有一個以一長串字母數(shù)字命令的文件:
圖片
這一大串是什么?
Git Object 目錄中存儲了三種對象:Commit, Tree 和 Blob,Git 會為對象生成一個文件,并根據(jù)文件信息生成一個 SHA-1 哈希值作為文件內(nèi)容的校驗和,創(chuàng)建以該校驗和前兩個字符為名稱的子目錄,并以 (校驗和) 剩下 38 個字符為文件命名 ,將該文件保存至子目錄下。
可以通過git cat-file -t 哈希值命令查看對象類型,通過git cat-file -p 哈希值命令查看對象中的內(nèi)容,哈希值就是目錄名+文件名,在沒有歧義的情況下,命令可以不用輸入整個哈希值,輸入前幾位即可。
我們挨個看下:
065bca(blob):
圖片
3b18e(blob):
圖片
824244(tree):
圖片
c5bc98(commit):
圖片
ca96(tree):
圖片
認(rèn)真看圖,大家看完也就差不多清楚了 commit、blob、tree 這幾大對象是什么東西了
從 commit 對象(c5bc98)入手,commit 對象中保存了 commit 的作者,commit 的描述信息,簽名信息以及該 commit 中包含哪些 tree 對象和 blob 對象。從上圖可知包含了 tree 對象(ca96)。
可以把 tree 對象看成這次提交相關(guān)的所有文件的根目錄,可以看到 ca96 這個 tree 對象中包含了一個 blob 對象(065bca),即 README 文件,以及一個 tree 對象(824244),即 src 目錄。而 blob 對象存儲的就是真正的內(nèi)容。
這幾個對象的對應(yīng)關(guān)系如下圖所示:
圖片
Git Brach 和 Tag現(xiàn)在來看下 HEAD 中的內(nèi)容,前面說過,HEAD 中存儲的是工作目錄當(dāng)前狀態(tài)對應(yīng)的 commit:
$ git:(master) cat .git/HEADref: refs/heads/master
$ git:(master) cat .git/refs/heads/masterc5bc98b8990bedd7444da537320559e601eba87b
c5bc98 正是我們最近的這次 commit!
master 是一個分支名,所以分支(branch)的本質(zhì)是一個指向 commit 的指針
我們切一個新分支feat/work:
圖片
查看下refs/heads/master和refs/heads/feat/work中的 commit 值:
圖片
從其內(nèi)容可以看到,feat/work 這個 branch 并沒有創(chuàng)建任何新的版本文件,和 master 一樣指向了 c5bc98 這個 commit。
從上面的實驗可以看出,一個 branch 其實只是一個 commit 對象的應(yīng)用,Git 并不會為每個 branch 存儲一份拷貝,因此在 git 中創(chuàng)建 branch 幾乎沒有任何代價。
接下來我們在 feat/work 這個 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 這個 branch,而 feat/work branch則指向了 8a442 這個commit,master branch 指向的 commit 未變化,仍然是 c5bc98。
查看 8a442 這個commit對象的內(nèi)容:
圖片
可以看到commit 有一個 parent 字段,指向了前一個 commit c5bc98。還包含了一個 tree 對象(2a9dd):
圖片
可以觀察到,由于 README 沒有變化,還是指向的 065bca 這個blob對象。License 是一個新建的 blob 對象,src 和 file1.txt 則指向了新版本的對象。
增加了這次 commit 后,Git 中各個對象的關(guān)系如下圖所示:
圖片
Tag 和 branch 類似,也是指向某個 commit 的指針。不同的是 tag 創(chuàng)建后其指向的 commit 不能變化,而 branch 創(chuàng)建后,其指針會在提交新的 commit 后向前移動。
關(guān)鍵詞:
這是一篇能讓你迅速了解Git工作原理的文章,實戰(zhàn)案例解析,相信我,3分
上期我們說到傳統(tǒng)的QoS采用一級調(diào)度,單個端口只能區(qū)分業(yè)務(wù)優(yōu)先級,無
怡和嘉業(yè)融資融券信息顯示,2023年8月14日融資凈買入193萬元;融資余額
《通知》顯示,對國家省級重點人才工程入選者、正副高級職稱專業(yè)技術(shù)人
,你們好,今天0471房產(chǎn)來聊聊一篇香鹽酥蝦,香鹽酥蝦簡述的文章,網(wǎng)友
天賜材料(SZ002709,收盤價:36 48元)8月14日晚間發(fā)布半年度業(yè)績報告
阿根廷中場帕雷德斯將以400萬歐的價格加盟羅馬,這也是羅馬本次夏窗第
0471房產(chǎn)來為大家解答以上的問題。亞冠賽程2020賽程表申花首輪,亞冠賽
2023年8月14日,瀘州市興瀘投資集團(tuán)有限公司2023年面向?qū)I(yè)投資者公開
從互聯(lián)網(wǎng)廣泛采用的早期階段到當(dāng)今的超連接時代,我們生成的數(shù)據(jù)量呈指
在計算傅里葉變換之前對信號去趨勢是一種常見的做法,特別是在處理時間
8月14日,江蘇常熟農(nóng)村商業(yè)銀行股份有限公司(常熟銀行,601128 SH)發(fā)
8月14日消息,資料顯示,高德地圖關(guān)聯(lián)公司高德軟件有限公司近日申請注
同花順金融研究中心8月14日訊,有投資者向棕櫚股份提問,董秘你好,北
8月14日,山東省人民政府新聞辦舉行新聞發(fā)布會介紹“生態(tài)警務(wù)”守護(hù)綠