這篇文章主要是對Git的基礎(chǔ)概念及原理進行整理。最初只知道Git是用來備份和協(xié)助多人開發(fā),同類的工具還有SVN,他們都叫做“版本控制”工具。所以關(guān)于Git的一切還要“版本控制”說起。
版本控制
什么是“版本控制”,為什么要使用它?先來一個官方定義,版本控制是一種記錄一個或若干個文件內(nèi)容變化,以便將來查閱特定版本修訂情況的系統(tǒng)。去掉定語從句,版本控制是一個系統(tǒng)。這個系統(tǒng)是用來做什么的呢?一是記錄文件內(nèi)容變化(暫且理解為備份),二是查閱特定版本修訂情況。
現(xiàn)在請跟著我想象一個場景,你是一個玄幻小說家,最近寫一本書叫《Git修仙之旅》,你的日常工作就是在電腦上寫小說。某天終于寫完了精彩的一章保存在桌面上,然后去洗澡了。這時你的強迫癥女朋友回來把桌面清理了一遍,你的作品就到了廢紙簍里。女朋友為了證明自己是一個合格的強迫癥,隨即清空了廢紙簍。半個鐘頭后你裹著浴袍出來了,女朋友自豪地對你說:老公看這下你的桌面清爽多了吧,還不親親人家。此時一萬匹草泥馬狂奔而過,你哭了。為什么當初沒有留個備份呢?不要怪她,你需要的是版本控制,不僅可以滿足你備份小說的需求,還可以幫你記錄每次增改的內(nèi)容,方便查閱。
是的,不僅僅是程序員,作家、設(shè)計師都可以使用版本控制。
本地版本控制
為了安全起見,你知道了要經(jīng)常在本地備份文稿。像下面這樣:

集中化的版本控制系統(tǒng)
接下來,老板提出一個要求,要求兩個人同時來完成這部作品。既要滿足自己的備份和記錄需求,還要到達合作目的。也就是兩臺計算機的合作模式,這得配一個服務(wù)器啊。像這樣:

可能你也發(fā)現(xiàn)服務(wù)器的重要性了,如果停電斷網(wǎng)你們就沒有辦法繼續(xù)合作了。
分布式版本控制系統(tǒng)
于是分布式版本控制系統(tǒng)(Distributed Version Control System,簡稱 DVCS)出現(xiàn)了。也就是本地不僅保留當前的作品,同事還保留每次修改的記錄。像這樣:

從此你可以放心的在電腦上完成作品了。而Git就是這分布式版本控制系統(tǒng)。
Git工作原理
首先來看一下SVN的工作原理:
SVN的保存信息記錄的是隨著時間變化,存儲每個文件與初始版本的差異,如圖:

而Git更像是把數(shù)據(jù)看作是對小型文件系統(tǒng)的一組快照。 每次你提交更新,或在 Git 中保存項目狀態(tài)時,它主要對當時的全部文件制作一個快照并保存這個快照的索引。 為了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是只保留一個鏈接指向之前存儲的文件。 Git 對待數(shù)據(jù)更像是一個快照流。
簡言之,就是直接記錄快照,而非差異比較。

Git 不需外連到服務(wù)器去獲取歷史,然后再顯示出來——它只需直接從本地數(shù)據(jù)庫中讀取。 你能立即看到項目歷史。 如果你想查看當前版本與一個月前的版本之間引入的修改,Git 會查找到一個月前的文件做一次本地的差異計算,而不是由遠程服務(wù)器處理或從遠程服務(wù)器拉回舊版本文件再來本地處理。由于Git不僅在本地保存了你正在操作的文件,還保留了所有快照。所以你在使用Git時,近乎所有操作都是本地執(zhí)行,且速度快近乎瞬間完成轉(zhuǎn)換。這意味著,沒有網(wǎng)絡(luò)時也可以使用Git工作。
3種狀態(tài)
Git中涉及的文件有三種狀態(tài),你的文件可能處于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。 已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地數(shù)據(jù)庫中。 已修改表示修改了文件,但還沒保存到數(shù)據(jù)庫中。 已暫存表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中。
由此引入 Git 項目的三個工作區(qū)域的概念:Git 倉庫、工作目錄以及暫存區(qū)域。

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