Git基礎(chǔ)
1.直接記錄快照宪哩,而非差異比較
Git和其它版本控制系統(tǒng)(包括Subversion和近似工具)的主要差別在于Git對待數(shù)據(jù)的方法通惫,概念上區(qū)分台诗,其它大部分系統(tǒng)以文件變更列表的方式存儲信息聊品。這類系統(tǒng)(CVS递雀、Subversion、Perforce悲雳、Bazaar等等)將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異挎峦。
Git不按照以上方式對待或保存數(shù)據(jù)。反之合瓢,Git更像是把數(shù)據(jù)看作是對小型文件的一組快照坦胶。每一提交更新,或在Git中保存項(xiàng)目狀態(tài)時晴楔,它主要對當(dāng)時的全部文件制作一個快照并保存這個快照的索引顿苇。為了高效,如果文件沒有修改税弃,Git不再重新存儲該文件纪岁,而是只保留一個鏈接指向之前存儲的文件。Git對待數(shù)據(jù)更像是一個快照流则果。
![Figure 1-2. 存儲項(xiàng)目隨時間改變的快照](https://git-scm.com/book/en/v2/book/01-introduction/images/snapshots.png)
這是Git與幾乎所有其它版本控制系統(tǒng)的重要區(qū)別幔翰。因此Git重新考慮了以前每一代版本控制系統(tǒng)延續(xù)下來的諸多方面。Git更像是一個小型的文件系統(tǒng)西壮,提供了許多以此為基礎(chǔ)構(gòu)建的超強(qiáng)工具遗增,而不只是一個簡單的VCS。
2.Git保證完整性
Git中所有的數(shù)據(jù)在存儲前都計(jì)算校驗(yàn)和茸时,然后以校驗(yàn)和來引用贡定,這意味著不可能在Git不知情時更改任何文件內(nèi)容或目錄內(nèi)容,這個功能建構(gòu)在Git底層可都,是構(gòu)成Git哲學(xué)不可或缺的部分。若在傳送過程中丟失信息或損壞文件蚓耽,Git就能發(fā)現(xiàn)渠牲。
Git用以計(jì)算校驗(yàn)和的機(jī)制叫做SHA-1散列(hash,哈希),這是一個由40個十六進(jìn)制字符組成的字符串,基于Git中文件的內(nèi)容或目錄結(jié)構(gòu)計(jì)算處來步悠。
實(shí)際上签杈,Git數(shù)據(jù)庫中保存的信息都是以文件內(nèi)容的哈希值來索引,而不是文件名鼎兽。
3.Git一般只添加數(shù)據(jù)
執(zhí)行Git操作答姥,幾乎只往Git數(shù)據(jù)庫中增加數(shù)據(jù)。很難讓Git執(zhí)行任何不可逆操作谚咬,或者讓它以任何方式清除數(shù)據(jù)鹦付。同別的VCS一樣,未提交更新時有可能丟失或弄亂修改的內(nèi)容择卦;但是一旦你提交快照到Git中敲长,就難以再丟失數(shù)據(jù)郎嫁,特別是如果定期的推送數(shù)據(jù)庫到其它倉庫的話。
4.三種狀態(tài)
Git有三種狀態(tài):已提交(committed)祈噪、已修改(modified)泽铛、以暫存(staged)。已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫中辑鲤。已修改表示修改了文件盔腔,但還沒保存到數(shù)據(jù)庫中。已暫存表示對一個已修改文件的當(dāng)前版本做了標(biāo)記月褥,使之包含在下次提交的快照中铲觉。
由此引入Git項(xiàng)目的三個工作區(qū)域的概念:Git倉庫、工作目錄以及暫存區(qū)域吓坚。
![Figure 1-3. 工作目錄撵幽、暫存區(qū)域以及Git倉庫](https://git-scm.com/book/en/v2/book/01-introduction/images/areas.png)
Git倉庫目錄是Git用來保存項(xiàng)目的元數(shù)據(jù)和對象數(shù)據(jù)庫的地方礁击。這是Git中最重要的部分盐杂。從其它計(jì)算機(jī)克隆倉庫時,拷貝就是這里的數(shù)據(jù)哆窿。
工作目錄是對項(xiàng)目的某個版本獨(dú)立提取出來的內(nèi)容链烈。這些從Git倉庫的壓縮數(shù)據(jù)庫中提取出來的文件,放在磁盤上供用戶使用或修改挚躯。
暫存區(qū)域是一個文件强衡,保存了下次提交的文件列表信息,一般在Git倉庫的工作目錄中码荔。有時候也別稱為"索引"漩勤,但更一般的說法是暫存區(qū)域。
基本的Git工作流程如下:
1.在工作目錄中修改文件
2.暫存文件缩搅,將文件的快照放入暫存區(qū)域
3.提交更新越败,找到暫存區(qū)域的文件,將快照永久性存儲到Git倉庫目錄硼瓣。
如果Git倉庫目錄中保存著特定版本的文件究飞,就屬于已提交狀態(tài)。如果做了修改并已存放入暫存區(qū)域堂鲤,就屬于已暫存狀態(tài)亿傅。如果上次取出后,做了修改但還沒放入暫存區(qū)域瘟栖,就是已修改狀態(tài)葵擎。