一、哈希
哈希是一個系列的加密算法,各個不同的哈希算法雖然加密強度不同,但是有以下幾個共同點:
①不管輸入數據的數據量有多大,使用同一個哈希算法,得到的加密結果長度固定
②哈希算法確定,輸入數據確定,輸出結果保證不變
③哈希算法確定,輸入數據有變化,輸出結果一定有變化,而且通常變化很大
④哈希算法不可逆
⑤哈希算法中不區分英文大小寫
哈希算法有很多種,如:MD5、SHA-1等。Git 底層采用的是 SHA-1 ,因為哈希算法可以被用來驗證文件,Git 就是靠這種機制來從根本上保證數據完整性的
二、Git保存版本的機制
1、集中式版本控制工具(如SVN)的文件管理機制:以文件變更列表的方式存儲信息。這類系統將它們保存的信息看作是一組基本文件(對應下圖的Version1)和每個文件隨時間逐步累積的差異(對應下圖的其他Version),在文件管理的時候只保存當前版本相對於上一個版本的差異,這是一種增量式的版本控制
2、Git 的文件管理機制:Git 把數據看作是小型文件系統的一組快照。每次提交更新時 Git 都會對當前的全部文件制作一個快照並保存這個快照的索引。為了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。所以 Git 的工作方式可以稱之為快照流。下圖中Version2及其之后的實線框中的文件表示該版本的該文件相較於上個版本有變動,虛線框中的文件表示該版本的該文件相較於上一版本沒有變動(只保存上一個版本的指針,而無需保存文件),這樣根據當前版本的文件和指向上一版本的指針就可以找到該版本的所有文件的狀態
Git 的提交對象:
提交對象及其父對象形成的鏈條:
三、Git的分支管理機制(依賴於指針的變化)
1、分支的創建:創建一個指向HEAD當前指向的分支的當前版本的指針
說明:此時HEAD指向master分支的f30ab版本,那么新創建的testing分支的指針也會指向master分支的f30ab版本,實際上是創建的分支的指針會指向HEAD指針指向的分支所在的版本
2、分支的切換:僅僅是改變HEAD指針的指向
說明:切換分支時,僅僅是切換一下HEAD指針的指向,從原分支指向想切換的分支
3、版本的提交
說明:若此時在testing分支上提交了版本,則只會使該分支的指針向后移動,不會影響其他分支,如上圖所示,其他分支的指針指向並沒有發生變化
4、沖突的產生
說明:在testing分支修改后,再將HEAD切換至master,然后在master上修改相同的文件,然后再master分支上提交,就會形成下面的局面:這時就有可能產生沖突,這合並版本的時候就需要解決沖突
5、和SVN的比較
SVN在創建分支的時候是將所有文件復制一份,而git僅僅是創建一個指向當前版本的指針,因此效率很高;Git中分支之間的切換僅僅是HEAD指針的變化,效率也很高;
綜上:Git的操作很依賴於HEAD指針的變化。
原文:https://blog.csdn.net/rubulai/article/details/84563106