GIT-概述與架構(gòu)

git_logo.png

簡書不維護(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)常見類別有三種:

  1. 本地版本控制系統(tǒng)、
  2. 集中式版本控制系統(tǒng)、
  3. 分布式版本控制系統(tǒng)鸭限;

1. 本地版本控制系統(tǒng)

代表有RCS(Revision Control System)蜕径,Linux下面的可用來作為配置文件管理的版本控制工具,本人嘗試了一下败京,工作使用不多兜喻;

local_version_control.png

關(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)很多人都很了解它宗侦。

centralized_version_control.png

優(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)是如今的趨勢茶没。

distributed_version_control.png

關(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_structure.png

上圖展示了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),如下圖:

dot_git_repository.png

簡要說明一下各個文件中所存放的內(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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吟吝,一起剝皮案震驚了整個濱河市剑逃,隨后出現(xiàn)的幾起案子蛹磺,更是在濱河造成了極大的恐慌同仆,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鳖轰,死亡現(xiàn)場離奇詭異蕴侣,居然都是意外死亡昆雀,警方通過查閱死者的電腦和手機(jī)蝠筑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進(jìn)店門挽封,熙熙樓的掌柜王于貴愁眉苦臉地迎上來臣镣,“玉大人智亮,你說我怎么就攤上這事阔蛉∽丛” “怎么了苗踪?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵毕莱,是天一觀的道長测暗。 經(jīng)常有香客問我磨澡,道長稳摄,這世上最難降的妖魔是什么厦酬? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任仗阅,我火速辦了婚禮,結(jié)果婚禮上短绸,老公的妹妹穿的比我還像新娘醋闭。我一直安慰自己朝卒,他們只是感情好抗斤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布丈咐。 她就那樣靜靜地躺著扯罐,像睡著了一般歹河。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秸歧,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天,我揣著相機(jī)與錄音今布,去河邊找鬼。 笑死侵蒙,一個胖子當(dāng)著我的面吹牛纷闺,可吹牛的內(nèi)容都是我干的犁功。 我是一名探鬼主播婚夫,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼限嫌,長吁一口氣:“原來是場噩夢啊……” “哼侍筛!你這毒婦竟也來了匣椰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤蛤奥,失蹤者是張志新(化名)和其女友劉穎凡桥,沒想到半個月后缅刽,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蠢络,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡啡省,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年髓霞,在試婚紗的時候發(fā)現(xiàn)自己被綠了方库。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薪捍。...
    茶點(diǎn)故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡酪穿,死狀恐怖被济,靈堂內(nèi)的尸體忽然破棺而出只磷,到底是詐尸還是另有隱情泌绣,我是刑警寧澤,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響炭晒,放射性物質(zhì)發(fā)生泄漏网严。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一嗤无、第九天 我趴在偏房一處隱蔽的房頂上張望震束。 院中可真熱鬧,春花似錦当犯、人聲如沸驴一。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肝断。三九已至,卻和暖如春驰凛,著一層夾襖步出監(jiān)牢的瞬間胸懈,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工恰响, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人首有。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓烙常,卻偏偏與公主長得像,于是被迫代替她去往敵國和親驼鞭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1.git的安裝 1.1 在Windows上安裝Git msysgit是Windows版的Git玻驻,從https:/...
    落魂灬閱讀 12,663評論 4 54
  • 《暗河泅渡者鯨書》 文/知乎戰(zhàn)斗雞 攝影/鯨書 (圖片已刪嗤锉,微博上有,諸位有興趣可以去看) 我只負(fù)責(zé)呈現(xiàn) ”我的報...
    485caf92ed0f閱讀 863評論 0 1
  • 天啦触菜,我被點(diǎn)燃啦,小時候,一直想要努力成為的牢屋,想要學(xué)習(xí)锋谐,獲得的,興趣鼓择,愛好呐能,一個一個都回來了首妖,每一個都那么鮮活象踊,生...
    黑水大鵬閱讀 125評論 0 2
  • 中國人寫的有關(guān)Chinglish(中式英語)的文章你可能看得不少量愧,但美國人寫的Chinglish,不知道你看過沒有...
    YIMOSKY閱讀 1,134評論 0 0
  • [日就月將]20170328周二茵宪,學(xué)習(xí)力踐行D13天凰狞,聽到彭彭講解識字部分,就是及時雨呀,剛想著要給孩子貼卡片認(rèn)字...
    wxgcgb閱讀 168評論 0 0