簡書不維護(hù)了议惰,歡迎關(guān)注我的知乎:波羅學(xué)的個人主頁
GIT是如今最流行的版本控制系統(tǒng)理茎。今年系統(tǒng)總結(jié)過一次關(guān)于GIT的使用竹宋,抽時間整理成文,分為幾個章節(jié)進(jìn)行簡述一下稍走。
一 基礎(chǔ)概念
GIT是一種版本控制軟件袁翁,那就首先了解一下什么是 “版本控制”?
比較官方的解釋是婿脸,版本控制系統(tǒng)是一種記錄一個或若干個內(nèi)容變化粱胜,以便將來查詢特定版本修訂情況的系統(tǒng)。
簡言之狐树,你的修改只要提到到版本控制系統(tǒng)焙压,基本都可以找回,版本控制系統(tǒng)就像一臺時光機(jī)器抑钟,可以讓你回到任何一個時間點(diǎn)涯曲。
了解了版本控制系統(tǒng)的功能,我們知道就算你把代碼改的一塌糊涂在塔,照樣可以恢復(fù)到我們過去的任何一個時間點(diǎn)幻件,工作量卻微乎其微。是不是很amazing蛔溃。
總結(jié)一下版本控制系統(tǒng)有哪些優(yōu)點(diǎn):
- 記錄文件所有歷史變化绰沥。這是版本控制系統(tǒng)的基本能力;
- 隨時恢復(fù)到任意時間點(diǎn)贺待。歷史記錄功能使我們不怕改錯代碼了徽曲;
- 支持多功能并行開發(fā)。通常版本控制系統(tǒng)都支持分支麸塞,保證了并行開發(fā)的可行秃臣;
- 多人協(xié)作并行開發(fā)。對于多人協(xié)作項目哪工,支持多人協(xié)作開發(fā)的版本管理將事半功倍奥此;
除了上面介紹的幾個比較常見的優(yōu)點(diǎn),版本控制系統(tǒng)的好處還有很多正勒,就不一一列舉了得院,可通過實(shí)踐自己逐漸體悟總結(jié)傻铣。下面基于GIT做更多介紹章贞。
二 常見類別
版本控制系統(tǒng)常見類別有三種:
- 本地版本控制系統(tǒng)、
- 集中式版本控制系統(tǒng)、
- 分布式版本控制系統(tǒng)鸭限;
1. 本地版本控制系統(tǒng)
代表有RCS(Revision Control System)蜕径,Linux下面的可用來作為配置文件管理的版本控制工具,本人嘗試了一下败京,工作使用不多兜喻;
關(guān)于其優(yōu)缺點(diǎn),簡述如下:
優(yōu)點(diǎn):
- 簡單赡麦,很多系統(tǒng)中都有內(nèi)置朴皆;
- 適合管理文本,如系統(tǒng)配置泛粹;
缺點(diǎn):
- 管理少量文件遂铡,不支持項目的管理;
- 支持的文件類型單一晶姊;
- 不支持遠(yuǎn)程扒接,網(wǎng)絡(luò)傳輸;
2. 集中式版本控制系統(tǒng)
代表如CVS们衙,SVN(Subversion)钾怔,SVN是曾經(jīng)最流行的版本管理系統(tǒng),很多人都有用過蒙挑,因而對于集中式版本控制系統(tǒng)很多人都很了解它宗侦。
優(yōu)點(diǎn):
- 適合多人團(tuán)隊協(xié)作開發(fā);
- 代碼集中化管理脆荷;
缺點(diǎn):
- 單點(diǎn)故障凝垛;
- 必須聯(lián)網(wǎng),無法單機(jī)工作蜓谋;
優(yōu)點(diǎn)就不多說了梦皮,大家可能對缺點(diǎn)更是記憶深刻。
單點(diǎn)故障桃焕,集中式管理的缺點(diǎn)剑肯,代碼集中在一臺機(jī)器上,這個問題其實(shí)可以通過備份集群解決观堂;
必須聯(lián)網(wǎng)工作让网,這個缺點(diǎn)我是深入痛覺,一旦公司網(wǎng)絡(luò)出現(xiàn)問題师痕,幾個小時甚至一天無法工作的經(jīng)歷都有溃睹。由于這些缺點(diǎn),便有了分布版本控制系統(tǒng)胰坟。
3. 分布式版本控制系統(tǒng)
代表就是今天要說的GIT了因篇。想知道GIT有多流行嗎?看看GITHUB就知道了,現(xiàn)在很多公司都已經(jīng)把自己的代碼庫遷移到了GIT竞滓。本人由于各種原因咐吼,近兩年已經(jīng)到了第三家公司,其中每家都聽過一次GIT的分享商佑【馇眩可見GIT在如今的流行程度,也說明了分布式版本控制系統(tǒng)是如今的趨勢茶没。
關(guān)于分布式版本控制系統(tǒng)肌幽,這里只說優(yōu)點(diǎn):
- 適合多人團(tuán)隊協(xié)作開發(fā);
- 代碼集中化管理抓半;
- 可以離線工作牍颈;
- 每個計算機(jī)都是一個完整倉庫;
1琅关、2兩點(diǎn)SVN也可以做到煮岁,說一下3、4點(diǎn)涣易。
可以離線工作画机,分布式版本管理系統(tǒng)每個計算機(jī)都有一個完整的倉庫,可本地提交新症,可以做到離線工作步氏。沒有了SVN令人抓狂的斷網(wǎng)無法工作問題;
每個計算機(jī)都是一個完整的倉庫,也就沒有了SVN的單點(diǎn)故障徒爹。
三 GIT與SVN的比較
GIT的作者Linus一直比較痛恨集中方式版本控制系統(tǒng)荚醒。雖然有很多已知免費(fèi)的集中式版本控制系統(tǒng),但是在2002之前提交Linux源碼的方式都是通過diff提交給Linus的隆嗅,然后進(jìn)行手工合并界阁。下面讓我們來以GIT與SVN作為代表,來看看為什么Linus痛恨集中式版本管理系統(tǒng)胖喳,而喜歡分布式版本管理系統(tǒng)泡躯。下面具體比較一下它們的區(qū)別:
1. GIT是分布式的,SVN為集中式的
這是常識丽焊,兩者最重要的區(qū)別较剃,也是后面所有區(qū)別的基石;
2. GIT隨處都是版本庫技健,SVN只有一個中央版本庫
因?yàn)镚IT是分布式的所以能做到到處都是版本庫写穴,而SVN是集中式的,所以只有一個中央倉庫雌贱。因而GIT能夠做到無需網(wǎng)絡(luò)提交啊送,到處到時版本庫弓颈,壓根不用擔(dān)心提交速度問題,不用時刻依賴與網(wǎng)絡(luò)工作删掀,不用擔(dān)心單點(diǎn)故障。當(dāng)工作完成之后直接推送遠(yuǎn)程即可實(shí)現(xiàn)工作協(xié)作导街;
3. GIT沒有全局版本號披泪,SVN有全局版本號
GIT版本庫到處都是,之間沒有實(shí)時共享數(shù)據(jù)搬瑰,所以無法確保版本號的唯一性款票,無法使用全局版本號,分布在各個機(jī)器上的版本庫版本號使用40位的HASH值取代泽论。重復(fù)的情況是存在的艾少,從數(shù)學(xué)的角度考慮,可能性是2的63次方分之一翼悴,基本可忽略缚够。而對于SVN,唯一版本鹦赎,所以能夠做到使用全局的版本號谍椅,版本號采用自增的方式;
4. GIT把內(nèi)容按元數(shù)據(jù)存儲古话,SVN按文件存儲
GIT存儲的不是實(shí)際的文件雏吭,而是指向性數(shù)據(jù)。SVN保存的是文件數(shù)據(jù)陪踩。當(dāng)GIT切換版本的時候杖们,實(shí)際上切換的是元數(shù)據(jù),而且本地操作肩狂,快捷有效摘完;
5. GIT記錄文件快照,SVN記錄文件差異
GIT的元數(shù)據(jù)傻谁,即指向性數(shù)據(jù)指向的是實(shí)際的文件快照描焰,這也是GIT能夠快速切換版本的一個原因。SVN保存的文件數(shù)據(jù)是各個版本之間的文件差異栅螟,所以切換版本的時候需要逐級的差異計算荆秦,速度比較慢,而且還需網(wǎng)絡(luò)傳輸力图。當(dāng)工程較大時步绸,速度與GIT相比差異會相當(dāng)?shù)拇蟆?/p>
6. GIT的內(nèi)容完整性高,SVN完整性低
因?yàn)镚IT的數(shù)據(jù)記錄都有HASH值校驗(yàn)吃媒,所以內(nèi)容完整性較高瓤介。而SVN則沒有此功能兵睛,內(nèi)容完整性低蔼啦。;
以上就是本人總結(jié)的GIT與SVN的部分差異。
四 GIT架構(gòu)
GIT的架構(gòu)姜钳,可以分為幾個部分:
- 本地工作區(qū)(working directory)
- 暫存區(qū)(stage area, 又稱為索引區(qū), index)、
- 本地倉庫(local repository)吞琐、
- 遠(yuǎn)程倉庫副本
- 遠(yuǎn)程倉庫(remote repository)邻梆。
如下圖:
上圖展示了git的整體架構(gòu),以及和各個部分相關(guān)的主要命令琢锋。先看了解說明下其中涉及的各個部分辕漂。
1. 工作區(qū)(working directory)
工作區(qū),簡言之就是你工作的區(qū)域吴超。對于git而言钉嘹,就是的本地工作目錄。工作區(qū)的內(nèi)容會包含提交到暫存區(qū)和版本庫(當(dāng)前提交點(diǎn))的內(nèi)容鲸阻,同時也包含自己的修改內(nèi)容跋涣。
2. 暫存區(qū)(stage area, 又稱為索引區(qū)index)
暫存區(qū)是git中一個非常重要的概念。是我們把修改提交版本庫前的一個過渡階段鸟悴。查看GIT自帶幫助手冊的時候仆潮,通常以index來表示暫存區(qū)。在工作目錄下有一個.git的目錄遣臼,里面有個index文件性置,存儲著關(guān)于暫存區(qū)的內(nèi)容。git add命令將工作區(qū)內(nèi)容添加到暫存區(qū)揍堰。
3. 本地倉庫(local repository)
版本控制系統(tǒng)的倉庫鹏浅,存在于本地。當(dāng)執(zhí)行g(shù)it commit命令后屏歹,會將暫存區(qū)內(nèi)容提交到倉庫之中隐砸。在工作區(qū)下面有.git的目錄蝙眶,這個目錄下的內(nèi)容不屬于工作區(qū)季希,里面便是倉庫的數(shù)據(jù)信息,暫存區(qū)相關(guān)內(nèi)容也在其中幽纷。
4. 遠(yuǎn)程版本庫(remote repository)
遠(yuǎn)程版本庫與本地倉庫概念基本一致式塌,不同之處在于一個存在遠(yuǎn)程,可用于遠(yuǎn)程協(xié)作友浸,一個卻是存在于本地峰尝。通過push/pull可實(shí)現(xiàn)本地與遠(yuǎn)程的交互;
遠(yuǎn)程倉庫副本
可以理解為存在于本地的遠(yuǎn)程倉庫緩存收恢。如需更新武学,可通過git fetch/pull命令獲取遠(yuǎn)程倉庫內(nèi)容祭往。使用fech獲取時,并未合并到本地倉庫火窒,此時可使用git merge實(shí)現(xiàn)遠(yuǎn)程倉庫副本與本地倉庫的合并硼补。
五 git文件一覽**
看看.git這個目錄的下文件結(jié)構(gòu),如下圖:
簡要說明一下各個文件中所存放的內(nèi)容信息:
1. HEAD
當(dāng)前所在位置熏矿,其實(shí)就是工作區(qū)的在版本庫中的那個提交點(diǎn)已骇,最終會指向一個40位的HASH值;
2. config
當(dāng)前版本庫的專有配置文件曲掰,如使用命令git config user.name poloxue便會記錄在此文件;
3. description
被gitweb (Github的原型)用來顯示對repo的描述奈辰。
4. hooks
git有可自動運(yùn)行在 git 任有意義階段的腳本hooks, 如commit/release/pull/push等狀態(tài)之前或者之后栏妖。個人思考的一個用處,如pre-push可以用來強(qiáng)制進(jìn)行代碼檢查奖恰。
5. index
存放暫存區(qū)(stage area)的相關(guān)信息吊趾;
6. info/exclue
可以做到和.gitignore相同的事情,用于排除不要包含進(jìn)版本庫的文件瑟啃。區(qū)別就是论泛,此文件不會被共享。
7. refs/heads
目錄下有關(guān)于本地倉庫的所有分支蛹屿;
8. refs/remote
目錄下有關(guān)于遠(yuǎn)程倉庫的所有分支屁奏;
9. object
目錄下存放的就是實(shí)際的數(shù)據(jù)文件,關(guān)于其中的存放方式暫時還不了解错负,有興趣可以研究一下坟瓢;
本節(jié)從版本控制引出分布式版本控制,比較分布式版本控制系統(tǒng)與其他版本控制系統(tǒng)的區(qū)別犹撒,從而引入GIT折联。與SVN的比較明顯可看出GIT的優(yōu)秀之處。對GIT的架構(gòu)也進(jìn)行整體簡單介紹识颊。內(nèi)容比較理論,期望在理清自己思路的同時清笨,不會誤導(dǎo)他人函筋。
好了奠伪,就說這么多首懈!文中如有錯誤究履,請幫忙指正脸狸!謝謝!
更多內(nèi)容泥彤,待續(xù) ...
附錄:
http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000
https://git-scm.com/book/zh/v2
http://blog.csdn.net/csfreebird/article/details/7925281
http://blog.csdn.net/zhaizu/article/details/47027183?ref=myread
http://www.cnblogs.com/lzlsky/p/5306323.html