1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Git 實現(xiàn)原理,你真的了解嗎?

        共 4659字,需瀏覽 10分鐘

         ·

        2021-01-25 14:12

        誕生的原因

        最初版本的git 誕生于Linus和他的團隊在開發(fā)Linux內(nèi)核的過程中。一開始,Linus和他的團隊選用的版本控制工具是BitKeeper(一款非開源,但是有條件免費的產(chǎn)品)。但后來由于種種原因BitKeeper宣布終止免費,當(dāng)時市面上也沒有能滿足Linux內(nèi)核開發(fā)所需要的分布式版本控制系統(tǒng),Linus為了解決這一問題,閉關(guān)一周,獨自設(shè)計編寫了初版git。

        名字含義

        Linus本人對git這一名字的解讀是愚蠢的內(nèi)容追蹤器(the stupid content tracker),git在俚語中表示的是愚蠢這一類的貶義詞。比較受人歡迎的解釋應(yīng)該是全局信息追蹤器(Global Information Tracker)。

        Git實現(xiàn)原理

        初始化一個git倉庫,此時文件夾中只有一個隱藏文件夾 .git , .git 文件夾為git的版本庫,存放git實現(xiàn)版本控制所需要的全部信息。使用 find .git 命令查看 .git 中存儲的內(nèi)容如下:

        下文將圍繞上圖中的文件目錄展開介紹(由于倉庫初始化,index文件,COMMIT_EDITMSG文件以及l(fā)ogs文件夾等沒有在上圖中顯示)。

        config

        config文件記錄項目的配置,如下圖:

        更改配置時,也可以直接對config文件中的內(nèi)容進行修改。如果某個git倉庫中的config文件配置與全局配置沖突,以該倉庫配置文件為準(zhǔn)。例:

        objects(對象庫)

        對象庫(objects)中包含該倉庫的原始文件數(shù)據(jù)。

        可尋址內(nèi)容名稱

        Git對象庫被組織及實現(xiàn)成一個內(nèi)容尋址的存儲系統(tǒng)。具體而言,對象庫中的每個對象都有一個唯一的名稱,這個名稱是向?qū)ο蟮膬?nèi)容應(yīng)用SHA1得到的SHA1散列值(一個對象的完整內(nèi)容決定了這個散列值)。

        實例展示:

        初始時,倉庫中有已提交的 file01.txt 以及 file02.txt 文件:

        根據(jù)類型來分,對象庫中的數(shù)據(jù)可以分為以下三類:

        1. 塊(blob)

        git倉庫中的每個文件的每一個版本表示為一個塊。每個塊被視為一個黑盒。一個塊保存一個文件的數(shù)據(jù),但不包含任何關(guān)于這個文件的元數(shù)據(jù),甚至連文件名也沒有。如下圖:

        1. 目錄樹(tree)

        一個目錄樹對象代表一層目錄信息。它記錄blob標(biāo)識符、路徑名和在一個目錄里所有文件的一些元數(shù)據(jù)。它也可以遞歸引用其他目錄樹或子樹對象,從而建立一個包含文件和子目錄的完整層次結(jié)構(gòu)。如下圖:

        1. 提交(commit)

        一個提交對象保存版本庫中每一次變化的元數(shù)據(jù),包括作者、提交者、提交日期和日志消息。每一個提交對象指向一個目錄樹對象。如下圖:

        上圖展示的例子中,提交為master分支的首次提交,對于非首次提交,commit對象還會記錄parent信息,即本次commit所對應(yīng)的上一次提交。三者關(guān)系對應(yīng)圖示如下:

        git追蹤內(nèi)容

        當(dāng)Git放置一個文件到對象庫中的時候,它基于文件內(nèi)容計算散列值而不是文件名。事實上,Git并不追蹤那些與文件次相關(guān)的文件名或者目錄名。如果兩個文件的內(nèi)容完全一樣,無論是否在相同的目錄,Git在對象庫里只保存一份blob形式的內(nèi)容副本。Git僅根據(jù)文件內(nèi)容來計算每一個文件的散列碼,如果文件有相同的SHA1值,它們的內(nèi)容就是相同的,然后將這個blob對象放到對象庫里,并以SHA1值作為索引。項目中的這兩個文件,不管它們在用戶的目錄結(jié)構(gòu)中處于什么位置,都使用相同的對象指代其內(nèi)容。

        實例展示:

        初始時,倉庫中只有一個已提交的 file01.txt 文件:

        上述過程的圖示變化如下:

        如果這些文件中的一個發(fā)生了變化,Git會為它計算一個新的SHA1值,識別出它現(xiàn)在是一個不同的blob對象,然后把這個新的blob加到對象庫里。原來的blob在對象庫里保持不變,給沒有變化的文件使用。其次,當(dāng)文件從一個版本變到下一個版本的時候,Git的內(nèi)部數(shù)據(jù)庫有效地存儲每個文件的每個版本,而不是它們的差異。因為Git使用一個文件的全部內(nèi)容的散列值作為文件名,所以它必須對每個文件的完整副本進行操作。

        存儲機制

        Git使用了一種叫做打包文件(packfile)的存儲機制。當(dāng)版本庫中有太多的松散對象(Git 最初向磁盤中存儲對象時所使用的格式被稱為“松散(loose)”對象格式),或者你手動執(zhí)行 git gc 命令,以及你向遠程服務(wù)器push時,Git 都會將這些松散對象打包成一個稱為“包文件(packfile)”的二進制文件。要創(chuàng)建一個打包文件,Git首先定位內(nèi)容非常相似的全部文件,然后為它們之一存儲整個內(nèi)容。之后計算相似文件之間的差異并且只存儲差異。因為Git是由文件內(nèi)容驅(qū)動的,所以它并不關(guān)心計算出來的兩個文件之間的差異是否屬于同一個文件的兩個版本。也就是說,Git可以在版本庫里的任何地方取出兩個文件并計算差異,只要它認為它們足夠相似來產(chǎn)生良好的數(shù)據(jù)壓縮。(Git有一套相當(dāng)復(fù)雜的算法來定位和匹配版本庫中內(nèi)容相似的文件)

        實例展示:

        初始時,倉庫中只有一個已提交的大小為12215字節(jié)的 file01.txt 文件:

        在打包前,objects/pack和objects/info文件夾為空,文件以松散對象的形式存儲在objects目錄下。打包后,文件全部打包到 objects/pack 中。pack后綴文件存儲對象文件,idx后綴文件是索引文件,用于允許它們被隨機訪問。objects/info 文件夾記錄對象存儲的附加信息,info/pack文件中記錄打包文件的文件名(上圖中為:P pack-c4750e76b36c227...idx)。

        index(索引)

        了解索引之前先說一下git的三個工作區(qū)域以及git倉庫中文件的三個狀態(tài)。

        三個工作區(qū)域

        1. 版本庫(repository)

        即上文中提到的 .git 文件夾。

        2. 工作目錄(working directory)

        工作區(qū)即當(dāng)前分支所對應(yīng)的文件目錄。

        3. 暫存區(qū)(staging area)

        在工作目錄與倉庫之間還有一個暫存區(qū)。當(dāng)我們在工作目錄中對文件進行增刪改等操作時,這些被修改的內(nèi)容在 git add 命令之后,就會被添加到暫存區(qū)中。git commit 之后,將暫存區(qū)中的內(nèi)容添加到版本庫中(進入對象庫中)。三個工作區(qū)域交互如下圖:

        文件分類

        Git將所有文件分成3類:已追蹤的、被忽略的以及未追蹤的。

        1. 已追蹤的(Tracked)

        已追蹤的文件是指已經(jīng)在版本庫,或者是在暫存區(qū)中的文件。

        2. 被忽略的(Ignored)

        被忽略的文件是指在工作目錄中出現(xiàn),但git并不記錄該文件(夾)的變動。被忽略的文件(夾)必須在版本庫中被明確聲明為不可見或被忽略,即 .gitignore 文件中聲明的文件(夾)。.gitignore 文件的格式如下: - 空行會被忽略,而以井號(#)開頭的行可以用于注釋。然而,如果#跟在其他文本后面,它就不表示注釋了。

          - 一個簡單的字面置文件名匹配任何目錄中的同名文件。

        - 目錄名由末尾的反斜線(/)標(biāo)記。這能匹配同名的目錄和子目錄,但不匹配文件或符號鏈接。

        - 包含shell通配符,如星號(*),這種模式可擴展為shell通配模式。正如標(biāo)準(zhǔn)shell通配符一樣,因為不能跨目錄匹配,所以一個星號只能匹配一個文件或目錄名。

        - 起始的感嘆號(!)會對該行其余部分的模式進行取反。此外,被之前模式排除但被取反規(guī)則匹配的文件是要包含的。取反模式會覆蓋低優(yōu)先級的規(guī)則。

        此外,Git允許在版本庫中任何目錄下有 .gitignore 文件,每個文件都只影響該目錄及其所有子目錄。.gitignore 的規(guī)則也是級聯(lián)的:可以覆蓋高層目錄中的規(guī)則。為了解決帶多個 .gitignore 目錄的層次結(jié)構(gòu)問題,也為了允許命令行對忽略文件列表的增編,Git按照下列從高到低的優(yōu)先順序?qū)ξ募M行忽略:- 在命令行上指定的模式( git update-index )

          - 從與文件在相同目錄的 `.gitignore` 文件中讀取的模式 

        - 上層目錄中指定的模式(最接近當(dāng)前目錄的上層目錄的模式優(yōu)先于更上層的目錄的模式)

        - 來自 `.git/info/exclude` 文件的模式

        - 來自配置變量core.excludedfile指定的文件中的模式。

        3. 未追蹤的(Untracked)

        未追蹤的文件是指那些不在前兩類中的文件。Git把工作目錄下的所有文件當(dāng)成一個集合,減去已追蹤的文件和被忽略的文件,剩下的部分作為未追蹤的文件。在工作目錄下新建的文件也是未追蹤文件。

        索引用來定位暫存區(qū)以及版本庫中的文件。當(dāng)對工作目錄下未追蹤文件或新的修改執(zhí)行 git add 時,這些內(nèi)容會被以blob對象的形式存入對象庫中,同時,index文件(二進制文件)記錄這些blob對象與文件的對應(yīng)關(guān)系。

        實例展示:

        初始時,倉庫中只有一個新建未提交的 file01.txt 文件:

        對文件作出修改并將修改添加到暫存區(qū)后,index文件變更對應(yīng)關(guān)系:

        HEAD、refs

        HEAD文件記錄當(dāng)前工作目錄所對應(yīng)的git分支,refs文件夾記錄分支以及tag(tag指向某一次commit,用來給開發(fā)分支做一個標(biāo)記,以便后續(xù)回退)。

        實例展示:

        初始時,倉庫中有已提交的 file01.txt 以及 file02.txt 文件:

        切換分支并提交新的commit后:

        在分別給兩次commit打上tag后:

        上述過程對應(yīng)圖示如下:

        info

        info目錄下只有exclude文件,其作用與 .gitignore 功能類似。他們的區(qū)別在于 .gitignore 這個文件本身也是存儲在對象庫中,用來保存的是公共需要排除的文件;而exclude文件中設(shè)置的則是本地需要排除的文件,不會影響到其他人。

        description

        description文件中的內(nèi)容用于GitWeb。GitWeb是Git提供的 CGI 腳本,讓用戶在web頁面查看git內(nèi)容。如果我們要啟動 GitWeb,可用命令 git instaweb --httpd=webrick 。這個命令在本地啟動了一個監(jiān)聽 1234 端口的 HTTP 服務(wù)器,并且自動打開了瀏覽器。想要關(guān)閉GitWeb,只需要在啟動命令的末尾加上 --stop 。打開的瀏覽器頁面如下:

        上圖中description字段對應(yīng)的內(nèi)容就是 .git/description 文件中記錄的內(nèi)容。

        hooks

        hooks目錄下的文件如下:

        Git 能在特定的動作發(fā)生時觸發(fā)自定義腳本,這些腳本(鉤子)都被存儲在 hooks子目錄中。如上圖,這些示例文件的名字都是以.sample結(jié)尾,如果想啟用這些鉤子,得先移除sample后綴。把一個正確命名(不帶擴展名)且可執(zhí)行的文件放入hooks子目錄中,即可激活該鉤子腳本。這樣一來,它就能被 Git 調(diào)用。

        COMMIT_EDITMSG

        COMMIT_EDITMSG文件記錄本地最后一次commit對應(yīng)的message。

        logs

        logs文件夾用來記錄操作信息,它的目錄如下:

        HEAD文件記錄所有分支上的操作信息:

        refs/heads/branch-name(分支名稱)文件記錄對應(yīng)分支上的操作信息:


        瀏覽 36
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲中午字幕| 久久久久久亚洲精品| 99视频内射三四| 做爰视频毛片蜜桃| 狠狠躁日日躁夜夜躁A片男男视频| 成人久久大香蕉| 殴美色色网| 九九国产视频| 伊人天天操| 大香蕉综合视频| 99成人在线视频| 亚洲无码A片在线| 激情99| av免费播放| 亚洲怡春院| 成人不卡视频| 成人在线18| 乱子伦一区二区三区视频在线观看 | 91丨人妻丨国产丨丝袜| 操啊操| 日韩高清在线播放| 在线免费看黄视频| 国产v亚洲| 精品中文一区二区三区| 成人大香蕉| 狠狠操综合网| www.91n| 中文字幕无码人妻在线视频| 欧美日韩中文字幕视频| 色呦呦视频| 无码成人在线观看| 日韩一级A片| 久久午夜夜伦鲁鲁一区二区| 一区二区三区免费看| 无码中文字幕在线视频| 亚洲一区翔田千里无码| 日韩黄色免费网站| 麻豆福利在线| 操逼视频免费看| 大香蕉久久草| 丁香成人五月天| 国产福利91| 一级欧美黑人大战白妞| 欧美午夜性爱视频| 91一级A片在线观看| 青青草99热| 无码av无码AV| 丁香五月网| 日韩无码激情| 国精产品一区一区三区四川| 中文字幕一区在线| 大香蕉大香蕉视频网| 九九九视频在线观看| 婷婷另类小说| 免费欧美三级片| 美国无码黄片| 日韩在线观看| 亚洲狠狠干| www.91麻豆| 日韩精品一二三| 91丨九色丨熟女丰满| 潮喷在线观看| 成人不卡视频| 天堂A片| 中文字幕在线无码视频| 日韩色妇| 日本欧洲三级| 巨乳无码噜噜噜久久久| 一区在线观看| 欧美一区二区在线| 成人三级av| 99综合在线| 午夜a片| 国产精品a久久久久| 天天爱天天爽| A黄色视频| 日韩三级网| 福利一区在线观看| 国产精品一级a毛视频| 操人在线观看| 鲁鲁鲁鲁鲁鲁鲁777777| 九九九色视频| 欧美亚洲黄色| 国产熟女一区二区三区五月婷| 狠狠干| 色天堂在线观看| av女人天堂| 日韩黄色在线观看| 欧美日韩免费在线观看| 91成人福利| 日韩狠狠| 亚洲色图一区二区三区| 俺来也俺也啪WWW色| 中文字幕免费高清网站| 成人在线A片| 婷婷五月欧美| 天天视频国产| 大香蕉网在线| 国产成人精品av在线观看| 91西安站街老熟女露脸| 激情爱爱网站| 无码中文一区| 国产深喉视频| 91中文字幕网| 亚洲综合激情网| 想要xx视频| 91乱| 国产c区| 国产激情视频网站| 天天天天日天天干| 伊人青青操| 国产精品久久毛片| 黄色视频毛片一一| 天天拍天天射| 呦小性Free小U女HD| 黄色无码在线观看| 亚洲AV成人无码一区二区三区| 一插菊花网| 免费黄色视频网站在线观看| 亚洲免费看黄| 亚洲午夜久久久久久久久| 亚洲无码AV一区二区| 欧美色逼逼| 黄片大全在线免费观看| 俺来俺去www色官网| 久久久久久久久久久国产| 老太色HD色老太HD-百度| 波多野结衣一级| 2014av天堂网| 亚洲精品suv视频| 中文字幕高清无码在线观看| 久久亚洲综合| 3344在线观看免费下载视频| 亚洲天堂在线观看免费| 五月天激情综合网| 无码av中文字幕| 国产亚洲中文字幕| 日韩五月天| 国产人妖在线观看| 河南少妇搡BBBB搡BBBB| 东京热精品视频| 欧美一级爱爱| 最新中文字幕在线观看| 日韩无码专区| 日本乱伦电影中文字幕| 国产精品9999久久久久仙踪林| 亚洲AV三级片| 久久国产精品在线| 色情片在线播放| 亚洲成人视频网| 亚洲av小说| 黄色一级片在线| av在线一区二区三区| 国产精品秘久久久久久| 婷婷色在线观看| 日本一区免费| 国产福利一区二区| 九九视频在线观看| 免费在线观看黄色| 欧美激情一区二区| 在线观看欧美日韩视频| 国产人国产视频成人免费观看…| 日韩精品人妻中文字幕蜜乳| 亚洲国产一区二区三区| 亚洲一区av| 手机在线小视频| 中文字幕日本欧美| 抠逼网站| 麻酥酥在线视频| 人妻无码中文字幕蜜桃| 蜜桃视频日韩| 无码专区中文字幕| 黄色免费在线观看| AV网站免费看| 亚洲综合一区二区| 大香蕉伊在线观看| 国产色婷婷| 免费看毛片中文字幕| 日本一级黄色电影网| 骚逼国产| 无码人妻一区二区三区蜜桃视频| 日韩中文字幕在线人成网站| 日韩AV无码专区亚洲AV| 久久XX| 日韩骚逼| 国产精品无码一区二区三区| 狠狠综合| 影视先锋久久| 91麻豆国产视频| 中文无码高清视频| 做爰视频毛片下载蜜桃视频| 久久精品99久久久久久| 婷婷伊人大香蕉| 99在线视频免费观看| 久久99精品国产| 亚洲男女av| 大香蕉尹人在线视频| 欧美三级欧美三级三级| 91爱在线| 午夜福利黄| 西西人体大胆ww4444| 午夜激情在线观看| 中文字幕你懂的在线三级| 久久精品视频在线免费观看| 91精品国产综合久久久久久久| 另类老妇性BBwBBw图片| 国产精品成人免费久久黄AV片 | 蜜臀久久99精品久久久晴天影视| 最新版本日本亚洲色| 香蕉一级视频| 97播播| 欧美操逼在线| 欧美性性生交XXXXX无码| 成人特级毛片全部免费播放| 日韩日逼视频| 国产精品18在线| 免费看V片| 亚洲天堂成人在线| 青娱乐Av| 一区二区网站| 亚洲永久| 精品乱码一区| 北条麻妃九九九精品视频免费观看| 好吊妞在线观看| 天天爽天天爽成人A片影院| 国产在线无码视频| 手机免费av| AV三级无码| 欧美熟妇擦BBBB擦BBBB| 特黄在线| 日韩毛片在线播放| 婷婷五月视频| 国产福利在线| 色五月婷婷五月天激情| 四虎91| 亚洲一区三区| 91小仙女jK白丝袜呻吟| 高清无码在线免费观看| 国产精品无码一区二区三| 亚洲中出| 国产亚洲久一区二区三区| 日逼黄色| 国产你懂的| 成人国产AV网站| 翔田千里在线观看| 黄色免费在线观看| 激情五月丁香婷婷| 九九热毛片在线观看| 免费观看成人毛片A片直播千姿| 五月激情丁香婷婷| 欧美丰满美乳XXⅩ高潮www| 超碰成人在线观看| 狠狠躁夜夜躁人人爽人妻| 欧美色图视频在线观看| yw视频在线观看| 黄片一区二区三区| 成人在线视频免费观看| 毛片黄片| 亚洲精品国产精品国自产| 日韩欧美123| www.大鸡巴| a在线观看免费| 操b视频在线播放| 色婷婷激情视频| av免费在线播放| 嫩草av在线| 国产永久在线| 欧美日韩色图| 97操碰| 午色婷婷国产无码| 91久久人澡人妻人人澡人人爽| 欧美在线日韩| 日韩免费一区| 免费中文字幕| 日韩日韩日韩日韩日韩| 亚洲理论视频| 黄色免费片| 做爱网站在线观看| 国产中文字幕免费| 波多野结衣高清无码视频| 色播五月丁香| 天天色天天干天天| 中文字幕视频免费| 北条麻妃在线观看| 欧美色图在线观看| 一本色道久久88亚洲精品综合| 狠狠色五月亚洲91| 在线激情| 久久欧洲成人精品无码区| 天天操夜夜操狠狠| 先锋av资源网| 影音先锋成人网| 成人午夜视频精品一区| 久热免费视频在线观看| 国产精品国产精品国产专区| 91成人片| 欧美日韩黄色极品| 亚洲视频黄色| 亚洲高清无码视频在线观看| 日本一级黄色电影网|