深入淺出 Git

開篇

你可能遇到過

版本管理

如果你遇到這個場景,那你可能需要版本控制。

什么是版本控制

版本控制最主要的功能就是追蹤文件的變更。它將什么時候、什么人更改了文件的什么內(nèi)容等信息忠實(shí)地了已錄下來。每一次文件的改變,文件的版本號都將增加。除了記錄版本變更外,版本控制的另一個重要功能是并行開發(fā)。軟件開發(fā)往往是多人協(xié)同作業(yè),版本控制可以有效地解決版本的同步以及不同開發(fā)者之間的開發(fā)通信問題,提高協(xié)同開發(fā)的效率。并行開發(fā)中最常見的不同版本軟件的錯誤(Bug)修正問題也可以通過版本控制中分支與合并的方法有效地解決。

—— 版本控制 from 百度百科

版本控制分為集中式、本地式、分布式。

Git:分布式版本控制

git 是一套以鍵值存儲的文件尋址系統(tǒng)。

工作區(qū)

git

Workspace:工作區(qū)

Index:暫存區(qū)

Repository:倉庫

Remote:遠(yuǎn)程倉庫

數(shù)據(jù)存儲原理

SH1A 算法

哈希算法的一種。對文件內(nèi)容進(jìn)行計(jì)算,可以得到一個哈希值,形如 5453545dccd33565a585ffe5f53fda3e067b84d8。
對于內(nèi)容不同的對象,會計(jì)算得到不同的SHA1哈希值。

幾種類型文件

Git 目錄(.git/objects/)的幾種(對象)類型文件:

blob

用來存儲文件內(nèi)容,或者說表示一個(完整的)文件,而不僅僅只是差異存儲。
Git 通過使用 zlib 壓縮文件,可以有效地壓縮文本文件的體積。因此 Git 比較適用于對文本文件的管理,對于二進(jìn)制文件(比如音頻、視頻)則壓縮比不大。
每個 blob 對象都會通過 SHA1 算法生成哈希值作為指針(或者叫索引、Key等),指向該文件的壓縮。
兩個一樣內(nèi)容只是名字不同的文件,會共享同一個 blob 對象。因?yàn)閮?nèi)容的 SHA1 是一樣的。

index

這里說的 index 就是上面說的暫存區(qū)的實(shí)體存在,其實(shí)是一個文件,位于 .git/index ,直接打開會亂碼,可以使用命令 git ls-files --stage 查看:

git ls-files --stage
----
100644 92390d97e4159df5c7ef31baf03c8a3378c93395 0       a.txt
100644 ff532afc325d8a07df0e2e3cb37bbee271d05840 0       dirb/b.txt

里面記錄了所有跟蹤文件的 blob 對象的哈希值,以及文件的路徑。
如果文件內(nèi)容沒有改變,index 里則一直指向舊的哈希值。

tree

代表的是目錄結(jié)構(gòu),或者簡單理解為代表一個目錄。tree 對象也會通過 SHA1 算法生成哈希值作為指針。tree 對象中包含一條或多條 blob 的指針。
目錄結(jié)構(gòu)如果是一樣的,會共享同一個 tree 對象。

commit

commit 存儲一次提交的信息,包括 tree、blob,父節(jié)點(diǎn)(的 commit id),以及提交的作者是誰等信息。
commit 的 ID 值就是對對象內(nèi)容進(jìn)行 SHA1 算法得到的哈希值。

git數(shù)據(jù)存儲

如何存儲數(shù)據(jù)

git add,生成 blob 文件,同時 index 文件中記錄。
git commit 時,根據(jù) index 文件中記錄的內(nèi)容,生成 tree 對象和 commit 對象。

一些概念

分支

體現(xiàn)在目錄的 ./git/refs/heads/ 中,這里包含master和一些其他分支文件。每個分支文件保存的是一個 commitID。

標(biāo)簽

其實(shí)就是保存了 commitID

常用命令

了解了原理后,再回過頭來看一些常用的 Git 命令:

git add
git commit
git pull
git push
...
git 工作流程

結(jié)語

分享個小故事。大家應(yīng)該都知道 Linux ——世界上最知名的開源操作系統(tǒng),Android 系統(tǒng)就是基于 Linux 內(nèi)核開發(fā)。它由 Linus Torvalds 在 1991 年發(fā)明,并最終經(jīng)由開源社區(qū)的無數(shù)個開發(fā)者共同開發(fā),至今仍然是最充滿生命力的操作系統(tǒng)之一。

2005 年,Linux 開發(fā)團(tuán)隊(duì)一直使用的商業(yè)版本控制系統(tǒng) BitKeeper 宣布不再免費(fèi)授權(quán)社區(qū)使用,Linus 在各種交涉無果后,花了兩周時間自己用 C 寫了一個分布式版本控制系統(tǒng)并且開源了,一個月之內(nèi)整個 Linux 系統(tǒng)的源碼就交由 Git 管理了。至此之后 Git 迅速成為最流行的版本控制系統(tǒng)之一。2008 年,Github 網(wǎng)站上線,為開源項(xiàng)目免費(fèi)提供 Git 存儲,總多知名項(xiàng)目紛紛遷移至 Github,同時也造福了無數(shù)的個人開發(fā)者。

開源萬歲!

參考

Git 是如何存儲文件的
Git底層原理

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容