為了更好的 Git 入門(mén)岖免。 我們從介紹版本控制工具的背景知識(shí)開(kāi)始,然后講解如何在你的系統(tǒng)上運(yùn)行 Git照捡,最后是關(guān)于如何設(shè)置 Git 以便開(kāi)始工作颅湘。 通過(guò)本章的學(xué)習(xí),你應(yīng)該能了解為什么 Git 這么流行栗精,為什么你應(yīng)該使用 Git 以及你應(yīng)該如何設(shè)置以便使用 Git栅炒。
關(guān)于版本控制
什么是“版本控制”?我為什么要關(guān)心它呢术羔? 版本控制是一種記錄一個(gè)或若干文件內(nèi)容變化赢赊,以便將來(lái)查閱特定版本修訂情況的系統(tǒng)。 在本書(shū)所展示的例子中级历,我們對(duì)保存著軟件源代碼的文件作版本控制释移,但實(shí)際上,你可以對(duì)任何類(lèi)型的文件進(jìn)行版本控制寥殖。
如果你是位圖形或網(wǎng)頁(yè)設(shè)計(jì)師玩讳,可能會(huì)需要保存某一幅圖片或頁(yè)面布局文件的所有修訂版本(這或許是你非常渴望擁有的功能)嚼贡,采用版本控制系統(tǒng)(VCS)是個(gè)明智的選擇熏纯。 有了它你就可以將選定的文件回溯到之前的狀態(tài),甚至將整個(gè)項(xiàng)目都回退到過(guò)去某個(gè)時(shí)間點(diǎn)的狀態(tài)粤策,你可以比較文件的變化細(xì)節(jié)樟澜,查出最后是誰(shuí)修改了哪個(gè)地方,從而找出導(dǎo)致怪異問(wèn)題出現(xiàn)的原因叮盘,又是誰(shuí)在何時(shí)報(bào)告了某個(gè)功能缺陷等等秩贰。 使用版本控制系統(tǒng)通常還意味著,就算你亂來(lái)一氣把整個(gè)項(xiàng)目中的文件改的改刪的刪柔吼,你也照樣可以輕松恢復(fù)到原先的樣子毒费。 但額外增加的工作量卻微乎其微。
本地版本控制系統(tǒng)
許多人習(xí)慣用復(fù)制整個(gè)項(xiàng)目目錄的方式來(lái)保存不同的版本愈魏,或許還會(huì)改名加上備份時(shí)間以示區(qū)別觅玻。 這么做唯一的好處就是簡(jiǎn)單,但是特別容易犯錯(cuò)培漏。 有時(shí)候會(huì)混淆所在的工作目錄溪厘,一不小心會(huì)寫(xiě)錯(cuò)文件或者覆蓋意想外的文件。
為了解決這個(gè)問(wèn)題北苟,人們很久以前就開(kāi)發(fā)了許多種本地版本控制系統(tǒng)桩匪,大多都是采用某種簡(jiǎn)單的數(shù)據(jù)庫(kù)來(lái)記錄文件的歷次更新差異打瘪。
其中最流行的一種叫做 RCS友鼻,現(xiàn)今許多計(jì)算機(jī)系統(tǒng)上都還看得到它的蹤影傻昙。 RCS 的工作原理是在硬盤(pán)上保存補(bǔ)丁集(補(bǔ)丁是指文件修訂前后的變化);通過(guò)應(yīng)用所有的補(bǔ)丁彩扔,可以重新計(jì)算出各個(gè)版本的文件內(nèi)容妆档。
集中化的版本控制系統(tǒng)
接下來(lái)人們又遇到一個(gè)問(wèn)題,如何讓在不同系統(tǒng)上的開(kāi)發(fā)者協(xié)同工作虫碉? 于是贾惦,集中化的版本控制系統(tǒng)(Centralized Version Control Systems,簡(jiǎn)稱(chēng) CVCS)應(yīng)運(yùn)而生敦捧。 這類(lèi)系統(tǒng)须板,諸如 CVS、Subversion 以及 Perforce 等兢卵,都有一個(gè)單一的集中管理的服務(wù)器习瑰,保存所有文件的修訂版本,而協(xié)同工作的人們都通過(guò)客戶(hù)端連到這臺(tái)服務(wù)器秽荤,取出最新的文件或者提交更新甜奄。 多年以來(lái),這已成為版本控制系統(tǒng)的標(biāo)準(zhǔn)做法窃款。
這種做法帶來(lái)了許多好處课兄,特別是相較于老式的本地 VCS 來(lái)說(shuō)。 現(xiàn)在晨继,每個(gè)人都可以在一定程度上看到項(xiàng)目中的其他人正在做些什么烟阐。 而管理員也可以輕松掌控每個(gè)開(kāi)發(fā)者的權(quán)限,并且管理一個(gè) CVCS 要遠(yuǎn)比在各個(gè)客戶(hù)端上維護(hù)本地?cái)?shù)據(jù)庫(kù)來(lái)得輕松容易紊扬。
事分兩面曲饱,有好有壞。 這么做最顯而易見(jiàn)的缺點(diǎn)是中央服務(wù)器的單點(diǎn)故障珠月。 如果宕機(jī)一小時(shí)扩淀,那么在這一小時(shí)內(nèi),誰(shuí)都無(wú)法提交更新啤挎,也就無(wú)法協(xié)同工作驻谆。 如果中心數(shù)據(jù)庫(kù)所在的磁盤(pán)發(fā)生損壞,又沒(méi)有做恰當(dāng)備份庆聘,毫無(wú)疑問(wèn)你將丟失所有數(shù)據(jù)——包括項(xiàng)目的整個(gè)變更歷史胜臊,只剩下人們?cè)诟髯詸C(jī)器上保留的單獨(dú)快照。 本地版本控制系統(tǒng)也存在類(lèi)似問(wèn)題伙判,只要整個(gè)項(xiàng)目的歷史記錄被保存在單一位置象对,就有丟失所有歷史更新記錄的風(fēng)險(xiǎn)。
分布式版本控制系統(tǒng)
于是分布式版本控制系統(tǒng)(Distributed Version Control System宴抚,簡(jiǎn)稱(chēng) DVCS)面世了勒魔。 在這類(lèi)系統(tǒng)中甫煞,像 Git、Mercurial冠绢、Bazaar 以及 Darcs 等抚吠,客戶(hù)端并不只提取最新版本的文件快照, 而是把代碼倉(cāng)庫(kù)完整地鏡像下來(lái)弟胀,包括完整的歷史記錄楷力。 這么一來(lái),任何一處協(xié)同工作用的服務(wù)器發(fā)生故障孵户,事后都可以用任何一個(gè)鏡像出來(lái)的本地倉(cāng)庫(kù)恢復(fù)萧朝。 因?yàn)槊恳淮蔚目寺〔僮鳎瑢?shí)際上都是一次對(duì)代碼倉(cāng)庫(kù)的完整備份夏哭。
更進(jìn)一步剪勿,許多這類(lèi)系統(tǒng)都可以指定和若干不同的遠(yuǎn)端代碼倉(cāng)庫(kù)進(jìn)行交互。值此方庭,你就可以在同一個(gè)項(xiàng)目中厕吉,分別和不同工作小組的人相互協(xié)作。 你可以根據(jù)需要設(shè)定不同的協(xié)作流程械念,比如層次模型式的工作流头朱,而這在以前的集中式系統(tǒng)中是無(wú)法實(shí)現(xiàn)的。