Git 的基本原理

哈希

  • 哈希是一個系列的加密算法,各個不同的哈希算法雖然加密強度不同,但是有以下幾個共同點:
    • 不管輸入數據的數據量有多大,輸入同一個哈希算法,得到的加密結果長度固定。
    • 哈希算法確定,輸入數據確定,輸出數據能夠保證不變。
    • 哈希算法確定,輸入數據有變化,輸出數據一定有變化,而且通常變化很大。
    • 哈希算法不可逆。
  • Git 底層採用的是 SHA-1 算法
    • 哈希算法可以被用來驗證文件。
    • 原理如下圖所示:
    • Git 就是靠這種機制來從根本上保證數據完整性的。

Git 保存版本的機制

  • 【SVN】集中式版本控制工具的文件管理機制
    • 以文件變更列表的方式存儲信息。這類系統將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異,也叫增量式的版本控制
    • 也就是說每個版本只保存文件的修改部分,當我想要某個歷史版本的數據的時候,我們會把當前版本的修改和歷史版本的修改,再加上原始文件,將這三部分拼到一塊,就是我們需要的版本的狀態。
    • 舉例:我們想要File C的Version 3版本,那麼需要原始文件File C和歷史版本的修改△1,再加上當前版本的修改△2,將這三個文件拼到一起就是我們需要的版本狀態。
  • 【Git 】分佈式的文件管理機制
    • Git 把數據看作是小型文件系統的一組快照。每次提交更新時 Git 都會對當前的全部文件製作一個快照並保存這個快照的索引爲了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是隻保留一個鏈接指向之前存儲的文件。所以 Git 的工作方式可以稱之爲快照流
    • 舉例:File A 的版本Version2和Version3從圖中可以看出版本都是A1,沒有改動,那麼Version3的A1不是重新存儲該文件,而是保留一個鏈接指向之前存儲的文件
  • Git 文件管理機制細節
    • Git 的 " 提交對象 "
    • 每次使用Git提交都會創建一個提交對象【下圖中的白色框】,每個提交對象都包含一個hash值,同時也包含一個樹對象【下圖中藍色框】的hash值,每個樹對象包含很多文件【下圖中黃色框】的內容以及該文件的hash值,每個文件對象都包含自己文件的內容以及該文件的hash值。
    • 提交對象及其父對象形成的鏈條【父子關係】

Git 分支管理機制

  • 分支的創建【本質上還是創建了一個指針指針的指向和master分支的指向相同】
  • 分支的切換
    • 切換分支到testing分支,就是移動了HEAD指針
    • testing分支提交了新的內容,testing就相對於master向前移動了一步
    • 再次切換到master分支,就是將HEAD指針再次指向master分支
    • 將master分支提交一次,testing和master分別指向兩個不同的版本,這兩個版本都以f30ab爲父對象
    • 到這裏纔開始了分差
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章