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 merge
和git 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元件過程中,你會發現它有自己預設的一些化學結構引數,如果這些引數不是你所需要的,你可以改變這些引數。本教程就來...