標籤:

如何理解git的快照?

所謂的快照具體存儲的是什麼?僅僅是diff還是包含diff的整個文件還是所有?又是如何通過快照去切換每次提交的呢?


  1. git會把出現變更的文件直接拷貝,形成新的blob,而非與上一個版本的diff。

  2. 所以一旦需要查看某版本直接load即可,而其他差異版本控制需要做merge,所以快。空間換時間。

  3. 並非每個當前版本都需要做備份,如果沒有改變,那麼快照其實是鏈接上一個版本。

  4. git會在隱藏目錄.git里存在object里,定期會優化,保證快照空間,和讀取時間的平衡。


git中的快照,就是一個備份,但這個備份不是像我們粘貼複製那麼簡單,git會處理,壓縮,你可以使用這個快照恢復原來的狀態。git會根據當前的內容生成一個校驗和,是以此校驗和為索引。每次提交,檢測到校驗和變化,就會生成一個新的快照,未更改的文件,則會鏈接到上一次的快照。這樣就形成了一條鏈(這裡先討論沒有其他分支的情況),git有一個HEAD指針,這個指針可以移動,這個指針移動到哪個快照,你就可以查看該快照也就是當時的狀態。最後一個問題沒讀明白,不知道這是不是你想要的答案。


快照的基本思想其實和immutable.js類似,使用immutable生成的對象都是不可變對象,每次對該對象進行修改都會生成一個新的對象,那麼是不是意味著需要把原來的舊對象重新複製一遍?顯然不是,immutable會維護一個樹形結構,新對象的修改只會添加某些節點,然後返回一個新的指針,並與舊對象共用相同的部分。git快照也是這樣,只不過是在文件系統層面實現的。我們都知道當你刪除一個文件後,文件原來所佔的磁碟空間並不是被清空,而是被文件系統標記為「已廢棄,可修改」的狀態,快照的作用就相當於將舊文件所佔的空間保留下來,並且保存一個引用,而新文件中會繼續使用與舊文件內容相同部分的磁碟空間,不同部分則寫入新的磁碟空間。總的來說git其實也算是保存diff的方式,只不過是在文件系統層次上實現的。


Git 保存數據是對文件系統的一組快照。 每次你提交更新時,它主要對當時的全部文件製作一個快照。如果文件沒有修改,Git 只保留一個鏈接指向之前存儲的文件。

我在博客中有比較詳細的介紹:http://hanfu.space/%E6%8A%80%E6%9C%AF/2015/08/26/git-tutorial/


推薦閱讀:

Working with Git | Git 與 GitHub
git 中如何撤銷部分修改?
Git如何在本地查看遠端倉庫超前本地提交的日誌信息?僅僅是日誌信息哦
為什麼git默認不區分文件夾大小寫?

TAG:Git |