git包含四種對象文件:html
粗略一看,能夠大體感受出blob相似於文件,而tree相似於文件夾,而commit則是囊括這一大堆東西的一個對象。git
SHA-1算法具體怎麼計算,能夠自行google。這裏只說一下該算法在git數據存儲中的應用。咱們能夠用git提供的命令來計算一個文件的SHA-1值:github
echo 'test content' | git hash-object --stdin d670460b4b4aece5915caf5c68d12f560a9fe3e4
輸入字符串 "test content",git會經過SHA-1算法將其中的內容計算出一個40個字符的HASH值。算法
一樣地,若是咱們在工做區新增一個文件,而後經過 git add
加入到暫存區,那麼git一樣地會根據這個文件經過SHA-1算法來計算出屬於該文件的一個HASH值。bash
這個值是惟一的!若是一個文件通過修改以後,再次計算獲得的HASH值會不會和原來的同樣?答案是確定不會的,因此這個HASH值就能夠充當一個標識符的做用。ui
對於blob對象,仔細觀察上一副圖能夠發現,blob對象的頭頂都有着5個字符,"5b1b3","911e7","cba0a"。其實這一段字符串就是所屬文件的HASH值的一部分。google
那麼它爲何會出如今blob的頭頂呢?其實當把一個新的文件放入到暫存區以後,git就在本身的目錄下 .git/object/
新建了一個文件對象,來保存新加入的文件,編碼
與此同時經過SHA-1算法來計算獲得一個所屬該對象的"標識",而這個對象,就是blob對象。(感受說的有點拗口)。大體過程以下圖:spa
沒錯,又多出了兩個hash值,即表明了兩個對象。同時考慮到上邊那個關係圖能夠大體猜想到,提交以後,又生成了兩個對象,一個tree對象,一個commit對象。.net
不過若是繼續帶着好奇心深刻下去,嘗試着去打開其中的一個文件,會發現裏邊是一堆16進制的數字,即便用Winhex打開,也是亂碼。這是由於git對原來文本中的數據進行了從新壓縮編碼,這樣既能夠保存原來的文本內容,又減小了對空間的佔用。
提到指針,那就確定要稍微提一下C、C++中的指針了。這種指針的做用很簡單,就是存儲一個變量的地址,而後根據這個地址來找到該對象,進而對其進行操做。
那麼,git中的指針也是這樣的嗎?其實,也差很少。只不過這裏存儲的並非變量的在內存上的地址,而是另一種形式的"地址",這就是HASH值。
沒錯,就是上邊計算出來的那個HASH值,commit對象的HASH值。
在上副圖中,我對Doge.txt文件又進行了修改,而後又放入到暫存區中,接着進行commit提交操做,而後輸入命令 git log
來查看全部提交的日誌記錄,咱們能夠看到有一排黃色的字符串,寫着 commit cbfa20cb4fc205477237d3ffc88909f7cb49bd6f
,這就是咱們次此提交以後生成的commit對象的HASH值。那麼,指針在哪裏呢?不急,接下來看下邊這幅圖:
這個文件是master文件,在 .git/refs/
目錄下。爲何要看這個文件呢?咱們在用git的時候,常常會看到master這個單詞,它是git中默認的一個分支,簡單點說這個master文件就是一個指針,這個指針記錄着一個commit提交對象的HASH值,經過這個HASH值咱們就能夠找到本次提交的tree對象、blob對象,這樣也就找到了咱們提交的文本信息了。
回顧一下咱們剛纔走過的路,咱們知道一次提交就對應着個commit對象,一個commit對象還帶着一個惟一標識的HASH值,那麼按照這樣的邏輯來推理的話,兩次提交就有會兩個commit對象,兩個不一樣的HASH值。若是要版本回退的話,是否是咱們只要指定一下回退到第幾個版本,而後得到相應的commit對象就能夠作到了?先來簡單地試驗一下吧:
圖中有兩行數據,同時在本地版本庫中也有兩個版本
上邊是一個簡單的版本回退示意圖,經過輸入命令 git reset 版本id
來回退到指定的版本。其實一個最簡單的版本回退就是如此。
其實在內部,就是將帶有HASH值的HEAD指針從最新的一個提交對象上轉移到上一個提交對象上。
對於版本回退,還有許多其餘的用法,包括reset的一些參數使用,checkout、revert命令的使用。有關它們的具體用法請戳這個傳送門:
代碼回滾:Reset、Checkout、Revert的選擇
這篇文章重點不是介紹git的命令用法,而是對其內部原理的一個簡單分析。我寫的比較白話,並且一直感受有些地方不夠完善,詳略不太得當,但也沒考慮好怎麼去修改、完善。但願本身在之後的不斷回看中,可以逐漸完善。
Git 工做區、暫存區和版本庫
使用原理視角看 Git
《Pro Git》的筆記-git內部原理
Git 用起來 の 基本原理
https://www.jianshu.com/p/9291dd3a99b3 深刻git數據存儲原理
做者:雅俗共賞M連接:https://www.jianshu.com/p/9291dd3a99b3來源:簡書簡書著做權歸做者全部,任何形式的轉載都請聯繫做者得到受權並註明出處。