這是我們開始學(xué)習(xí) Git 的第一節(jié)課,主要帶大家初識(shí) Git。本節(jié)課會(huì)從 Git 的誕生、以及 Git 是什么、Git 能做什么這幾個(gè)方面進(jìn)行一個(gè)簡(jiǎn)單的介紹,讓大家對(duì) Git 有一個(gè)初步的了解,為以后的課程做一個(gè)鋪墊。好了,讓我們開始走進(jìn) Git 的世界!
1. Git 的前世今生
我們學(xué)一樣技術(shù)或者一種工具,剛開始最好先了解一下它的來龍去脈。雖然無關(guān)使用,但通過它背后的故事可能會(huì)激發(fā)起我們學(xué)習(xí)它的濃厚興趣,從這一點(diǎn)來講還是有實(shí)際意義的。
提起 Git,就不得不提起 Linus 和他的 Linux。計(jì)算機(jī)相關(guān)從業(yè)者大多都知道,linus 創(chuàng)建了 Linux 系統(tǒng),但是 Linux 系統(tǒng)并不是由 Linus 一個(gè)人完成的,它依賴于廣大的開發(fā)者源源不斷的貢獻(xiàn)代碼來共同開發(fā)維護(hù)。那么問題來了,這么多人來共同維護(hù)一個(gè)系統(tǒng),當(dāng)時(shí)大家是怎樣來保持高效的協(xié)作呢?這么多人提交代碼,是怎么保證代碼不沖突呢?你可能會(huì)想到使用過的一些版本控制系統(tǒng),不過可能要讓你失望了,雖然當(dāng)時(shí)有很多版本控制系統(tǒng)像 CVS、SVN 等,但是都被 linus 舍棄了,因?yàn)檫@些集中式的版本控制系統(tǒng)需要聯(lián)網(wǎng),而且速度很受影響。所以,很長(zhǎng)一段時(shí)間內(nèi),都是靠 linus 來自己手工合并的(默默送上大拇指)。
但是,Linux 系統(tǒng)越來越龐大,這么下去不是個(gè)問題。直到 2002 年左右,BitMover 公司將他們的商業(yè)的版本控制系統(tǒng) BitKeeper 給 Linux 社區(qū)免費(fèi)使用,這下大家的工作量稍微減輕了些。但是好景不長(zhǎng),社區(qū)牛人聚集,還沒一兩個(gè)手腳亂動(dòng)的?有人試圖破解 BitKeeper 的協(xié)議,但是被 BitMover 公司發(fā)現(xiàn)了,于是乎 BitMover 公司一怒之下收回了他們的使用權(quán)。
本來單車變摩托,現(xiàn)在又騎單車了。不過,Linus 就是 Linus,怎么可能重走舊路呢,畢竟合并代碼手很疼。痛定思痛,沒花多久自己用 C 開發(fā)了一套分布式版本管理系統(tǒng),沒錯(cuò)就是 Git!
后來 Git 越來越流行,比如程序員大型交友網(wǎng)站 Github 使用的就是 Git 存儲(chǔ)。
2. Git 是什么
我們先來看下官方解釋:
Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency.
Git is_ easy to learn and has a tiny footprint with lightning fast performance. It outclasses SCM tools like Subversion, CVS, Perforce, and ClearCase with features like cheap local branching, convenient staging areas, and multiple workflows.
簡(jiǎn)單給大家翻譯下,它的意思是說:
Git 是一個(gè)免費(fèi)的開源分布式版本控制系統(tǒng),旨在快速高效地處理從小型到大型項(xiàng)目的所有內(nèi)容。
Git 易于學(xué)習(xí),且性能出眾。 它的本地分支,方便的暫存區(qū)域和多個(gè)工作流等功能,其性能優(yōu)于 Subversion,CVS,Perforce 和 ClearCase 等 SCM 工具。
其實(shí),翻譯過來還是有點(diǎn)晦澀難懂。其中一些概念對(duì)于新手來說很難真正理解。別著急,我挑其中的重點(diǎn)概念來給大家具體講解下。
2.1 分布式版本控制系統(tǒng)
分布式版本控制系統(tǒng)是相對(duì)于集中式版本控制系統(tǒng)來說的。
集中式版本控制系統(tǒng)首先需要聯(lián)網(wǎng),提交文件速度依賴于網(wǎng)絡(luò)帶寬。而且,集中式版本控制系統(tǒng)的版本庫是集中存放在中央服務(wù)器的,每個(gè)人提交內(nèi)容的時(shí)候,需要先提交到中央服務(wù)器,然后再從中央服務(wù)器拉取別人的修改到自己的本地。
分布式版本控制系統(tǒng)沒有中央服務(wù)器,每個(gè)人本地都是一個(gè)完整的版本庫,所以也不依賴網(wǎng)絡(luò)。多個(gè)人在自己本機(jī)修改同一個(gè)文件后,只需把各自的修改推送給對(duì)方,就可以互相看到對(duì)方的修改了。
基于以上特點(diǎn)可以看出,分布式版本控制系統(tǒng)的安全性比集中式版本控制系統(tǒng)高。因?yàn)槊總€(gè)人電腦里都有完整的版本庫,你電腦宕機(jī)丟失本地修改后,隨便從其他人那里復(fù)制一個(gè)就可以了。而集中式版本控制系統(tǒng)的中央服務(wù)器要是出了問題,那就很難恢復(fù)了。
2.2 分支
分支,可以先簡(jiǎn)單理解成就是一條時(shí)間線,對(duì)于給 A 老板的文檔,每個(gè)人每一次提交修改過程都是這條時(shí)間線上的一個(gè)節(jié)點(diǎn),這些節(jié)點(diǎn)共同串成了一條時(shí)間線,也就是一個(gè)分支。同樣,你可以創(chuàng)建一個(gè) B 分支,在 B 分支上進(jìn)行另一個(gè)版本的修改提交。
關(guān)于分支的理論與具體操作,我們?cè)诤罄m(xù)詳細(xì)說明。
2.3 快照
Git 與任何其他 VCS 之間的主要區(qū)別在于對(duì)數(shù)據(jù)的處理方式。
大多數(shù)其他版本控制系統(tǒng)將信息存儲(chǔ)為基于文件的更改的列表。這些其他系統(tǒng)保存的是對(duì)每個(gè)文件所做的更改(通常稱為基于增量的版本控制)。如下圖,每個(gè)版本記錄的是文件發(fā)生的改變。
而 Git 每次提交或保存項(xiàng)目狀態(tài)時(shí),基本上都會(huì)拍下當(dāng)時(shí)所有文件的圖片,并存儲(chǔ)對(duì)該快照的引用。為了提高效率,如果文件沒有更改,Git 不會(huì)再次存儲(chǔ)該文件,而只是指向它已經(jīng)存儲(chǔ)的先前相同文件的鏈接。Git 更像是一堆快照來處理數(shù)據(jù)。如下圖,每個(gè)版本記錄的是文件完整的信息。
3. Git 能干什么
舉個(gè)例子,你和多個(gè)同事需要寫作完成一個(gè) word 文檔,每個(gè)同事負(fù)責(zé)其中一部分,那么怎么進(jìn)行協(xié)作編寫呢?可能會(huì)是各自寫完自己的模塊后由某個(gè)人進(jìn)行手工整理成你們需要的內(nèi)容。但這樣其實(shí)很不方便,所以版本控制系統(tǒng)出現(xiàn)了,它的作用替最后那個(gè)人進(jìn)行整理的。當(dāng)然,遠(yuǎn)不止這一個(gè)功能,比如你們的文檔編寫完畢后弄丟了,版本控制系統(tǒng)可以幫忙找回歷史文件。再比如,你需要整理多個(gè)不同版本的 word 文檔給不同的 boss 看,你大可不必備份多份副本,版本控制系統(tǒng)同樣可以輕松完成。所有的版本控制系統(tǒng)都是干這些的,像 SVN、CVS 等,當(dāng)然 Git 也不例外。不同的是,Git 有自己的特點(diǎn)和版本管理方式,后續(xù)我們會(huì)詳細(xì)講解。
4. 總結(jié)
好了,今天先帶大家初識(shí) Git,我們先從概念上對(duì) Git 有一個(gè)大致的了解,后續(xù)再通過實(shí)際的操作和深入的理論講解去學(xué)習(xí) Git。
本小節(jié)知識(shí)點(diǎn)回顧:
- Git 的誕生:絕地求生
- Git 是什么:如官網(wǎng)所說,fast version control
- Git 能干什么:主要用來管理多人協(xié)作下對(duì)文件版本的控制