hash值 更改git Git版本儲存原理

2021-10-12 19:36:59 字數 2553 閱讀 6568

git為什麼是現在網際網路最流行的版本控制工具,在我看來git有其與眾不同的地方,也就是過人之處:

簡述了下git的過人之處,那麼就來看看其內部的實現原理。

svn的儲存方式如下圖:

其實就是儲存每個檔案不同版本之間的差異。那麼回溯版本的時候是不是需要拼接或者剔除差異後,才能得到最終的內容,如果乙個檔案版本的迭代次數越多,版本的回溯就會越慢。

那麼,git的快照是怎麼儲存的呢?

就是同個檔案,每個版本都會儲存乙份快照,如果下個版本檔案沒有修改,就會延用原先的快照,用乙個指標指向原先的快照即可。

那麼git怎麼知道檔案沒有被修改呢?其實git會用一種sha-1的雜湊演算法基於檔案的內容計算出乙個hash值,git可以通過hash值來索引檔案,檔案內容一致,hash值必然一致,這也是為什麼你只修改了檔名但內容並沒有修改,git卻能感知到該檔案已經換了乙個檔名,而不是乙個新增的檔案,因為它基於內容計算出的hash值是相同的。

假設我們在新建的乙個git專案,執行git add 1.txt,就會看到檔案.git/object下多了個資料夾和檔案,如圖:

友情提示,檢視目錄樹的命令watch -n 1 tree .git/

下面我們通過hash值便可以索引到檔案內容。

這個時候我們執行git commit -m 'first commit' 1.txt,發現.git/object下又產生幾個新的資料夾,很顯然黃色框部分就是新產生的。

再來看下其中裡面儲存的是什麼內容

看到這裡,你是不是明白了什麼,原來6dc2這個hash對應的文字裡面包含了1.txt檔案的hash值檔名稱

再往下看,你是不是明白了徹底懂了,原來這個98de這個hash對應的文字裡面包含了6dc2提交注釋和作者資訊

檢視git log發現,原來98de就是commitid

也就是我們通過98de這個commitid找到6dc2對應的tree,再通過tree裡面儲存的5711這個hash值就可以索引到文字快照。

如果再提交乙個新的檔案呢?就會生成新的commitid,我們檢視最新的commitid,就會看到多了乙個parent節點,很顯然它指向上次提交的commitid

再看下master分支,儲存也是這個最新的commitid,這樣我們就知道,分支不過就是儲存乙個指標,指標的表現形式就是hash值。

通過下面的圖我們可以直觀的感受下,他們之間的關聯關係:

git回溯版本直接就通過版本對應的commitid,層層索引下去就能將當前版本下的所有檔案給找出來,因為每個檔案版本都有乙個快照,並不像svn一樣需要對比檔案差異,所以速度是非常快的。

理解git原理對於我們使用git本身也會有非常大的好處,當然,筆者沒有講分支的合併,其實你懂了這篇文章,你去看git分支合併原理相關的文章,你也會更加理解git merge的幾種合併方式以及git mergegit rebase本質上有什麼不同,以及他們各自的實現原理。

最近一段時間都在看netty原始碼,核心的邏輯過了下,有些地方設計得確實比較巧妙,不知道有沒有機會給讀者來一篇,不過很建議大家去把tcp/ip深入了解下,這樣對於整個網路程式設計的理解也會更加深刻,因為分布式系統之間的通訊都逃不過網路協議,這樣對於你理解各種中介軟體應相關的協議,比如redis,mq的上層協議也會非常快。

Beta版本(有更改)

作業所屬課程 作業要求鏈結 homework 3350 團隊名稱 八仙過海一 團隊成員 學號 姓名 201731107105 唐夢釩 201731062525 菅彭悅 201731107115 鄧清月 201731106311 解慕榮 201731084433 李純銳 201731062522 尹發...

更改Ubuntu核心版本

適合計算機 3.17.0 放到目錄 downloads linux 3.17.3 2 安裝 cd downloads linux 3.17.3 sudo dpkg i deb 當前路徑沒有其它.deb檔案 3 修改 cd etc default sudo gedit grub grub hidden...

Chem 3D模型的引數值更改方法

在化學繪圖軟體chemoffice 15.1中有個專門用於繪製三維結構的元件,就是chem 3d。通過這個元件使用者可以繪製3d模型並可以通過這個元件來計算一些化學資料。在使用chem 3d元件過程中,你會發現它有自己預設的一些化學結構引數,如果這些引數不是你所需要的,你可以改變這些引數。本教程就來...