一、簡史
Git 是因?yàn)長inux 內(nèi)核開源社區(qū)與分布式版本控制系統(tǒng)的BitKeeper的合作結(jié)束,人家不給用了,怎么辦呢?自己開發(fā)一套唄,Git就誕生了。
二、基礎(chǔ)
Git與(SVN,CVS, Perforce)有什么區(qū)別?
都是版本控制系統(tǒng),我自己用過SVN和Git,最大的區(qū)別就是Git可以在家里不用連VPN就能夠提交版本。而SVN就必須連網(wǎng)才可以。那么造成這種差異的原因呢?
因?yàn)閮煞N系統(tǒng)的實(shí)現(xiàn)方式不一樣。以SVN為例,SVN是記錄每個(gè)文件的哪些內(nèi)容變化,進(jìn)行版本控制的。而Git則是比較整個(gè)文件的變化。這么說有點(diǎn)兒抽象,看圖吧。
SVN等系統(tǒng)的記錄版本的方式。
每次記錄有哪些文件作了更新,以及都更新了哪些行的什么內(nèi)容。
Git 并不保存這些前后變化的差異數(shù)據(jù)。實(shí)際上,Git 更像是把變化的文件作快照后,記錄在一個(gè)微型的文件系統(tǒng)中。每次提交更新時(shí),它會(huì)縱覽一遍所有文件的指紋信息并對(duì)文件作一快照,然后保存一個(gè)指向這次快照的索引。為提高性能,若文件沒有變化,Git 不會(huì)再次保存,而只對(duì)上次保存的快照作一鏈接。Git 的工作方式就像下圖所示。
Git幾乎所有的操作都可以在本地完成
與svn總是從服務(wù)器更新數(shù)據(jù)相比,Git可以在本地完成很多的操作。因?yàn)?Git 在本地磁盤上就保存著所有當(dāng)前項(xiàng)目的歷史更新,所以處理起來速度飛快。用 CVCS 的話,沒有網(wǎng)絡(luò)或者斷開 VPN 你就無法做任何事情。但用 Git 的話,就算你在飛機(jī)或者火車上,都可以非常愉快地頻繁提交更新,等到了有網(wǎng)絡(luò)的時(shí)候再上傳到遠(yuǎn)程倉庫。
時(shí)刻保持?jǐn)?shù)據(jù)完整性
Git 使用 SHA-1 算法計(jì)算數(shù)據(jù)的校驗(yàn)和,通過對(duì)文件的內(nèi)容或目錄的結(jié)構(gòu)計(jì)算出一個(gè) SHA-1 哈希值,作為指紋字符串。該字串由 40 個(gè)十六進(jìn)制字符(0-9 及 a-f)組成,看起來就像是:
24b9da6552252987aa493b52f8696cd6d3b00373
Git 的工作完全依賴于這類指紋字串,所以你會(huì)經(jīng)常看到這樣的哈希值。實(shí)際上,所有保存在 Git 數(shù)據(jù)庫中的東西都是用此哈希值來作索引的,而不是靠文件名。
文件的三種狀態(tài)
重點(diǎn)!重點(diǎn)!重點(diǎn)!
對(duì)于任何一個(gè)文件,在 Git 內(nèi)都只有三種狀態(tài):
已提交(committed),
已修改(modified)
已暫存(staged)。
已提交表示該文件已經(jīng)被安全地保存在本地?cái)?shù)據(jù)庫中了;
已修改表示修改了某個(gè)文件,但還沒有提交保存;
已暫存表示把已修改的文件放在下次提交時(shí)要保存的清單中。
基本的 Git 工作流程如下:
在工作目錄中修改某些文件。
對(duì)修改后的文件進(jìn)行快照,然后保存到暫存區(qū)域。
提交更新,將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲(chǔ)到 Git 目錄中。