直接記錄快照,而非差異比較
Git和其它版本控制系統(包括 Subversion 和近似工具)的主要差別在于 Git 對待數據
的方法。 概念上來區分,其它大部分系統以文件變更列表的方式
存儲信息。 這類系統(CVS、Subversion、Perforce、Bazaar 等等)將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異
。存儲差異的方式,如下圖:

Git 不按照以上方式對待或保存數據。 反之,Git 更像是把數據看作是對小型文件系統的一組
快照
。 每次您提交更新,或在 Git 中保存項目狀態時,它主要對當時的全部文件制作一個快照并保存這個快照的索引。 為了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是只保留一個鏈接
指向之前存儲的文件。 Git 對待數據更像是一個 快照流
。存儲快照的方式,如下圖:
這是 Git 與幾乎所有其它版本控制系統的重要區別。 因此 Git 重新考慮了以前每一代版本控制系統延續下來的諸多方面。 Git 更像是一個
小型的文件系統
,提供了許多以此為基礎構建的超強工具,而不只是一個簡單的 VCS。
近乎所有操作都是本地執行
Git大部分操作都是本地操作
,所以,相較于所有操作都需要網絡開銷的集中式版本控制系統,Git速度飛快。舉個例子,要瀏覽項目* 的歷史,Git 不需外連到服務器去獲取歷史,然后再顯示出來——它只需直接從本地數據庫中讀取。 你能立即看到項目歷史。這也意味著你離線或者沒有VPN是,你幾乎可以進行任何操作。你在飛機或火車上想做些工作,也能愉快地提交,直到有網絡連接時再上傳到遠程庫,這是集中式版本控制系統做不到的。
Git 保證完整性
Git 中所有數據在存儲前都計算校驗和,然后以校驗和來引用。 這意味著不可能在 Git 不知情時更改任何文件內容或目錄內容。 這個功能建構在 Git 底層,是構成 Git 哲學不可或缺的部分。 若你在傳送過程中丟失信息或損壞文件,Git 就能發現。
Git 用以計算校驗和的機制叫做 SHA-1 散列。 這是一個由 40 個十六進制字符(0-9 和 a-f)組成字符串,基于 Git 中文件的內容或目錄結構計算出來。 SHA-1 哈希看起來是這樣:
24b9da6552252987aa493b52f8696cd6d3b00373
Git中使用這種哈希值的情況很多,你將經常看到這種哈希值。 實際上,Git 數據庫中保存的信息都是以文件內容的哈希值來索引,而不是文件名。
Git 一般只添加數據
我們執行的 Git 操作,幾乎只是往 Git 數據庫中增加數據。 很難讓 Git 執行任何不可逆操作,或者讓它以任何方式清除數據。
Git三種狀態
Git有三種狀態,你的文件可能處于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)
。 已提交
表示數據已經安全的保存在本地數據庫中。 已修改
表示修改了文件,但還沒保存到數據庫中。 已暫存
表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
由此引入 Git 項目的三個工作區域的概念:Git 倉庫、工作目錄以及暫存區域
。

Git倉庫
是Git用來保存項目的元數據和對象數據庫的地方。 這是 Git 中最重要的部分,從其它計算機克隆倉庫時,拷貝的就是這里的數據。
工作目錄
是對項目的某個版本獨立提取出來的內容。 這些從 Git 倉庫的壓縮數據庫中提取出來的文件,放在磁盤上供您使用或修改。
暫存區域
是一個文件,保存了下次將提交的文件列表信息,一般在 Git 倉庫目錄中。 有時候也被稱作“索引”,不過一般說法還是叫暫存區域。
基本的 Git 工作流程如下:
1.在工作目錄中修改文件。
2.暫存文件,將文件的快照放入暫存區域。
3.提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄。
如果 Git 目錄中保存著的特定版本文件,就屬于已提交狀態。 如果作了修改并已放入暫存區域,就屬于已暫存狀態。 如果自上次取出后,作了修改但還沒有放到暫存區域,就是已修改狀態。