淺析 Git 思想和工作原理

從根本上來(lái)講柬唯,Git是一個(gè)內(nèi)容尋址文件系統(tǒng)揭北,并在此之上提供了一個(gè)版本控制系統(tǒng)的用戶界面隐砸,它是一個(gè)非常強(qiáng)大且易用的工具之碗,理解Git的工作原理,能夠幫助我們更容易學(xué)習(xí)和使用Git季希。

本文不會(huì)像書籍里那樣褪那,一條條討論checkout、branch式塌、remote等諸如此類動(dòng)詞形式的高層命令和底層命令博敬,本文主要從宏觀方向傳達(dá)Git的思想和工作原理,能夠使初學(xué)者更加理解峰尝,更利于學(xué)習(xí)偏窝。

git
git

直接記錄快照,而非差異比較

Git 和其他版本控制系統(tǒng)的主要差別在于武学,Git 只關(guān)心文件數(shù)據(jù)的整體是否發(fā)生變化祭往,而大多數(shù)其他系統(tǒng)則只關(guān)心文件內(nèi)容的具體差異。這類系統(tǒng)(CVS火窒,Subversion硼补,Perforce,Bazaar 等等)每次記錄有哪些文件作了更新熏矿,以及都更新了哪些行的什么內(nèi)容:


其他系統(tǒng)在每個(gè)版本中記錄著各個(gè)文化的具體差異

Git 并不保存這些前后變化的差異數(shù)據(jù)已骇。實(shí)際上缆八,Git 更像是把變化的文件作快照后,記錄在一個(gè)微型的文件系統(tǒng)中疾捍。每次提交更新時(shí)奈辰,它會(huì)縱覽一遍所有文件的指紋信息并對(duì)文件作一快照,然后保存一個(gè)指向這次快照的索引乱豆。為提高性能奖恰,若文件沒(méi)有變化,Git 不會(huì)再次保存宛裕,而只對(duì)上次保存的快照作一鏈接瑟啃。Git 的工作方式就如下圖所示。


Git保存每次更新時(shí)的文件快照

這是 Git 同其他系統(tǒng)的重要區(qū)別揩尸。它完全顛覆了傳統(tǒng)版本控制的套路蛹屿,并對(duì)各個(gè)環(huán)節(jié)的實(shí)現(xiàn)方式作了新的設(shè)計(jì)。Git 更像是個(gè)小型的文件系統(tǒng)岩榆,但它同時(shí)還提供了許多以此為基礎(chǔ)的超強(qiáng)工具错负,而不只是一個(gè)簡(jiǎn)單的 VCS。

工作區(qū)和暫存區(qū)

Git 和其他版本控制系統(tǒng)的一個(gè)不同之處就是有暫存區(qū)的概念勇边。

工作區(qū)(Working Directory)

在電腦中能看到的目錄犹撒,比如我建立的gittest就是一個(gè)工作區(qū)


工作區(qū)
版本庫(kù)(Repository)

工作區(qū)中的隱藏目錄.git,就是Git的版本庫(kù)粒褒。

工作區(qū)和版本庫(kù)

Git的版本庫(kù)里存了很多東西识颊,其中最重要的就是稱為stage(或者叫index)的暫存區(qū),還有Git為我們自動(dòng)創(chuàng)建的第一個(gè)分支master奕坟,以及指向master的一個(gè)指針叫HEAD祥款。

回憶在我上一篇博客中提到的將文件添加到版本庫(kù)的流程圖:

將文件添加到版本庫(kù)

通過(guò)以上兩幅圖不難看出,需要提交的文件經(jīng)過(guò)add后先都放到暫存區(qū)index(或者叫stage)中月杉,然后經(jīng)過(guò)commit指令刃跛,一次性提交暫存區(qū)的所有修改到head。一旦提交后沙合,暫存區(qū)清空奠伪,同時(shí)若對(duì)工作區(qū)沒(méi)有做任何修改,那么工作區(qū)就是干凈的(working directory clean)

文件的三種狀態(tài)

對(duì)任何一個(gè)文件首懈,在Git內(nèi)都有三種狀態(tài):

  • 已提交(committed):表示該文件已經(jīng)被安全的保存在本地?cái)?shù)據(jù)庫(kù)中了
  • 已修改(modified):表示修改了某個(gè)文件,但還沒(méi)有提交保存
  • 已暫存(staged):表示把已修改的文件放在下次提交時(shí)要保存的清單中
文件流轉(zhuǎn)圖

所謂的暫存區(qū)域只不過(guò)是個(gè)簡(jiǎn)單的文件谨敛,一般都放在 Git 目錄中究履。有時(shí)候人們會(huì)把這個(gè)文件叫做索引文件,不過(guò)標(biāo)準(zhǔn)說(shuō)法還是叫暫存區(qū)域脸狸。

我們可以從文件所處的位置來(lái)判斷狀態(tài):

  • Git 目錄中保存著的特定版本文件----->已提交狀態(tài)
  • 作了修改并已放入暫存區(qū)域----->已暫存狀態(tài)
  • 自上次取出后最仑,作了修改但還沒(méi)有放到暫存區(qū)域----->已修改狀態(tài)

重要的 .git 目錄

當(dāng)一個(gè)新目錄或已有目錄執(zhí)行git init時(shí)藐俺,Git會(huì)創(chuàng)建一個(gè).git目錄。這個(gè)目錄包含了幾乎所有Git存儲(chǔ)和操作的對(duì)象泥彤。若想備份或復(fù)制一個(gè)版本庫(kù)欲芹,只需把這個(gè)目錄拷貝至另一處即可。對(duì)于一個(gè)全新的版本庫(kù)吟吝,該目錄結(jié)構(gòu)如下所示:

目錄結(jié)構(gòu)圖
  • description文件:僅供GitWeb程序使用
  • config文件:包含項(xiàng)目特有的配置選項(xiàng)
  • info目錄:包含一個(gè)全局性排除(global exclude)文件菱父,用以放置那些不希望被記錄在 .gitignore文件中的忽略模式(ignored patterns)
  • hooks目錄:包含客戶端或服務(wù)端的鉤子腳本(hook scripts)
  • HEAD文件:指示目前被檢出的分支
  • index文件:保存暫存區(qū)信息
  • objects目錄:存儲(chǔ)所有數(shù)據(jù)內(nèi)容
  • refs 目錄:存儲(chǔ)指向數(shù)據(jù)(分支)的提交對(duì)象的指針

關(guān)于Git底層命令和高層命令的原理討論,很大一部分都在這個(gè)目錄中剑逃,要想了解具體的原理浙宜,可以看這本書,這里僅僅列出了每部分的功能蛹磺,有個(gè)大體了解粟瞬。

基本的 Git 工作流程

  1. 在工作目錄中修改某些文件。
  2. 對(duì)修改后的文件進(jìn)行快照萤捆,然后保存到暫存區(qū)域裙品。
  3. 提交更新,將保存在暫存區(qū)域的文件快照永久轉(zhuǎn)儲(chǔ)到 Git 目錄中俗或。

分析 Git 命令

有了上述介紹清酥,我們可以對(duì) Git 的命令有更深的理解,這里以將文件添加到代碼庫(kù)為例進(jìn)行分析:我們都知道需要兩步蕴侣,第一步add焰轻,第二步commit,但為什么要分兩步呢昆雀?每一步都做了什么呢辱志?

(1)git commit -a:相當(dāng)于運(yùn)行 git add 把所有當(dāng)前目錄下的文件加入暫存區(qū)域再運(yùn)行 git commit
(2)git commit <file_name>:進(jìn)行一次包含最后一次提交加上工作目錄中文件快照的提交,并且文件被添加到暫存區(qū)域
(3)git checkout HEAD -- <file_name>:回滾到復(fù)制最后一次提交

以上僅僅分析了添加文件到代碼庫(kù)的過(guò)程狞膘,更多命令詳解看這里

參考資料

廖雪峰的git在線教程
免費(fèi)的git書箱 progit2
Git思想和基本工作原理
圖解Git

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末揩懒,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挽封,更是在濱河造成了極大的恐慌已球,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辅愿,死亡現(xiàn)場(chǎng)離奇詭異智亮,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)点待,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門阔蛉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人癞埠,你說(shuō)我怎么就攤上這事状原×兀” “怎么了?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵颠区,是天一觀的道長(zhǎng)削锰。 經(jīng)常有香客問(wèn)我,道長(zhǎng)毕莱,這世上最難降的妖魔是什么器贩? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮央串,結(jié)果婚禮上磨澡,老公的妹妹穿的比我還像新娘。我一直安慰自己质和,他們只是感情好稳摄,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著饲宿,像睡著了一般厦酬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上瘫想,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天仗阅,我揣著相機(jī)與錄音,去河邊找鬼国夜。 笑死减噪,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的车吹。 我是一名探鬼主播筹裕,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼窄驹!你這毒婦竟也來(lái)了朝卒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤乐埠,失蹤者是張志新(化名)和其女友劉穎抗斤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丈咐,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瑞眼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扯罐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片负拟。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖歹河,靈堂內(nèi)的尸體忽然破棺而出掩浙,到底是詐尸還是另有隱情,我是刑警寧澤秸歧,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布厨姚,位于F島的核電站,受9級(jí)特大地震影響键菱,放射性物質(zhì)發(fā)生泄漏谬墙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一经备、第九天 我趴在偏房一處隱蔽的房頂上張望拭抬。 院中可真熱鬧,春花似錦侵蒙、人聲如沸造虎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)算凿。三九已至,卻和暖如春犁功,著一層夾襖步出監(jiān)牢的瞬間氓轰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工浸卦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留署鸡,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓限嫌,卻偏偏與公主長(zhǎng)得像靴庆,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萤皂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • Git是目前最流行的版本管理系統(tǒng)撒穷,也是最先進(jìn)的分布式版本控制系統(tǒng)(distributed version cont...
    pro648閱讀 5,717評(píng)論 1 17
  • 法國(guó)生物學(xué)家喬治·居維葉認(rèn)為,“天才裆熙,首先是注意力端礼。 注意力不集中直接影響孩子的學(xué)習(xí) 注意力不集中的孩子在上課聽講...
    耿銳鵬閱讀 445評(píng)論 0 1
  • 如果你經(jīng)常在天亮前噩夢(mèng)連連,讀些有安撫功效的小說(shuō)最能鎮(zhèn)定心神入录,請(qǐng)?jiān)诖策叿乓晦麑懞恿鞯男≌f(shuō)蛤奥,在滔滔奔流的河水中飄回睡...
    蘿卜閱讀 260評(píng)論 0 1
  • 2017-07-03 點(diǎn)點(diǎn) 點(diǎn)滴看世界 《不可思議的朋友》是一部關(guān)于自閉癥兒童成長(zhǎng)的用心之作,取材于真實(shí)故事僚稿。 用...
    點(diǎn)滴看世界閱讀 492評(píng)論 0 0
  • 我被推進(jìn)了一個(gè)混亂的黑洞凡桥,不知道怎么去簡(jiǎn)化所有的一切,這樣的生活蚀同,焦灼而讓人心死缅刽!
    一根蘆葦?shù)乃秸Z(yǔ)閱讀 235評(píng)論 0 0