1.3 Git 基礎(chǔ)

2018-02-24 15:22 更新

Git 基礎(chǔ)

那么,簡單地說,Git 究竟是怎樣的一個(gè)系統(tǒng)呢? 請注意接下來的內(nèi)容非常重要,若你理解了 Git 的思想和基本工作原理,用起來就會知其所以然,游刃有余。 在開始學(xué)習(xí) Git 的時(shí)候,請努力分清你對其它版本管理系統(tǒng)的已有認(rèn)識,如 Subversion 和 Perforce 等;這么做能幫助你使用工具時(shí)避免發(fā)生混淆。 Git 在保存和對待各種信息的時(shí)候與其它版本控制系統(tǒng)有很大差異,盡管操作起來的命令形式非常相近,理解這些差異將有助于防止你使用中的困惑。

直接記錄快照,而非差異比較

Git 和其它版本控制系統(tǒng)(包括 Subversion 和近似工具)的主要差別在于 Git 對待數(shù)據(jù)的方法。 概念上來區(qū)分,其它大部分系統(tǒng)以文件變更列表的方式存儲信息。 這類系統(tǒng)(CVS、Subversion、Perforce、Bazaar 等等)將它們保存的信息看作是一組基本文件和每個(gè)文件隨時(shí)間逐步累積的差異。

Figure 1-5.?存儲項(xiàng)目隨時(shí)間改變的快照.

這是 Git 與幾乎所有其它版本控制系統(tǒng)的重要區(qū)別。 因此 Git 重新考慮了以前每一代版本控制系統(tǒng)延續(xù)下來的諸多方面。 Git 更像是一個(gè)小型的文件系統(tǒng),提供了許多以此為基礎(chǔ)構(gòu)建的超強(qiáng)工具,而不只是一個(gè)簡單的 VCS。 稍后我們在Git 分支討論 Git 分支管理時(shí),將探究這種方式對待數(shù)據(jù)所能獲得的益處。

近乎所有操作都是本地執(zhí)行

在 Git 中的絕大多數(shù)操作都只需要訪問本地文件和資源,一般不需要來自網(wǎng)絡(luò)上其它計(jì)算機(jī)的信息。 如果你習(xí)慣于所有操作都有網(wǎng)絡(luò)延時(shí)開銷的集中式版本控制系統(tǒng),Git 在這方面會讓你感到速度之神賜給了 Git 超凡的能量。 因?yàn)槟阍诒镜卮疟P上就有項(xiàng)目的完整歷史,所以大部分操作看起來瞬間完成。

舉個(gè)例子,要瀏覽項(xiàng)目的歷史,Git 不需外連到服務(wù)器去獲取歷史,然后再顯示出來——它只需直接從本地?cái)?shù)據(jù)庫中讀取。 你能立即看到項(xiàng)目歷史。 如果你想查看當(dāng)前版本與一個(gè)月前的版本之間引入的修改,Git 會查找到一個(gè)月前的文件做一次本地的差異計(jì)算,而不是由遠(yuǎn)程服務(wù)器處理或從遠(yuǎn)程服務(wù)器拉回舊版本文件再來本地處理。

這也意味著你離線或者沒有 VPN 時(shí),幾乎可以進(jìn)行任何操作。 如你在飛機(jī)或火車上想做些工作,你能愉快地提交,直到有網(wǎng)絡(luò)連接時(shí)再上傳。 如你回家后 VPN 客戶端不正常,你仍能工作。 使用其它系統(tǒng),做到如此是不可能或很費(fèi)力的。 比如,用 Perforce,你沒有連接服務(wù)器時(shí)幾乎不能做什么事;用 Subversion 和 CVS,你能修改文件,但不能向數(shù)據(jù)庫提交修改(因?yàn)槟愕谋镜財(cái)?shù)據(jù)庫離線了)。 這看起來不是大問題,但是你可能會驚喜地發(fā)現(xiàn)它帶來的巨大的不同。

Git 保證完整性

Git 中所有數(shù)據(jù)在存儲前都計(jì)算校驗(yàn)和,然后以校驗(yàn)和來引用。 這意味著不可能在 Git 不知情時(shí)更改任何文件內(nèi)容或目錄內(nèi)容。 這個(gè)功能建構(gòu)在 Git 底層,是構(gòu)成 Git 哲學(xué)不可或缺的部分。 若你在傳送過程中丟失信息或損壞文件,Git 就能發(fā)現(xiàn)。

Git 用以計(jì)算校驗(yàn)和的機(jī)制叫做 SHA-1 散列(hash,哈希)。?這是一個(gè)由 40 個(gè)十六進(jìn)制字符(0-9 和 a-f)組成字符串,基于 Git 中文件的內(nèi)容或目錄結(jié)構(gòu)計(jì)算出來。 SHA-1 哈??雌饋硎沁@樣:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 中使用這種哈希值的情況很多,你將經(jīng)??吹竭@種哈希值。 實(shí)際上,Git 數(shù)據(jù)庫中保存的信息都是以文件內(nèi)容的哈希值來索引,而不是文件名。

Git 一般只添加數(shù)據(jù)

你執(zhí)行的 Git 操作,幾乎只往 Git 數(shù)據(jù)庫中增加數(shù)據(jù)。 很難讓 Git 執(zhí)行任何不可逆操作,或者讓它以任何方式清除數(shù)據(jù)。 同別的 VCS 一樣,未提交更新時(shí)有可能丟失或弄亂修改的內(nèi)容;但是一旦你提交快照到 Git 中,就難以再丟失數(shù)據(jù),特別是如果你定期的推送數(shù)據(jù)庫到其它倉庫的話。

這使得我們使用 Git 成為一個(gè)安心愉悅的過程,因?yàn)槲覀兩钪梢员M情做各種嘗試,而沒有把事情弄糟的危險(xiǎn)。 更深度探討 Git 如何保存數(shù)據(jù)及恢復(fù)丟失數(shù)據(jù)的話題,請參考撤消操作。

三種狀態(tài)

好,請注意。 如果你希望后面的學(xué)習(xí)更順利,記住下面這些關(guān)于 Git 的概念。 Git 有三種狀態(tài),你的文件可能處于其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。 已提交表示數(shù)據(jù)已經(jīng)安全的保存在本地?cái)?shù)據(jù)庫中。 已修改表示修改了文件,但還沒保存到數(shù)據(jù)庫中。 已暫存表示對一個(gè)已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中。

由此引入 Git 項(xiàng)目的三個(gè)工作區(qū)域的概念:Git 倉庫、工作目錄以及暫存區(qū)域。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號