一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

一文解析Git文件的三種狀態(tài)

張康康 ? 來(lái)源:陳翠 ? 2019-07-29 18:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Git作為大家熟悉的,深受歡迎的版本控制工具,和其他同類(lèi)工具有很多不同之處:

Git始終保存快照而不是文件差異。

任何數(shù)據(jù)存儲(chǔ)前始終使用SHA-1計(jì)算校驗(yàn)和,保證內(nèi)容完整性。

使用分布式倉(cāng)庫(kù)設(shè)計(jì),讓大多數(shù)操作都在本地進(jìn)行,保證了使用效率。

幾乎所有操作都是向數(shù)據(jù)庫(kù)增加數(shù)據(jù),提交之后就很難丟失數(shù)據(jù)。

它的本質(zhì)更像一個(gè)內(nèi)容尋址(content-addressable)文件系統(tǒng),并在此之上提供了一個(gè)版本控制系統(tǒng)的用戶(hù)界面。

Git 有三種狀態(tài),你的文件可能處于其中之一:已修改(modified)、已暫存(staged)、已提交(committed)。由此引出三個(gè)邏輯區(qū)域,他們和文件狀態(tài)以及部分對(duì)應(yīng)操作的關(guān)系如下圖。

高層命令和底層命令:Git 最初是一套面向版本控制系統(tǒng)的工具集,它包含很多用于完成底層工作的命令。這些命令被設(shè)計(jì)成能以UNIX 命令行的風(fēng)格連接,或由腳本調(diào)用來(lái)完成更復(fù)雜的工作。這部分一般被稱(chēng)作“底層(plumbing)”命令,那些對(duì)用戶(hù)更友好的命令則被稱(chēng)作“高層(porcelain)”命令。

下面新建兩個(gè)空倉(cāng)庫(kù)A 和B,來(lái)觀察隱藏在Git常見(jiàn)命令下的實(shí)際執(zhí)行過(guò)程。

1.git init

此命令初始化一個(gè)新本地倉(cāng)庫(kù),它在工作目錄下生成一個(gè)名為.git的隱藏文件夾。

查看該文件夾結(jié)構(gòu):

config//文件- 包含一些配置選項(xiàng)

objects//目錄- 存儲(chǔ)所有Git的數(shù)據(jù)對(duì)象

HEAD//文件- 指定當(dāng)前分支

info //目錄- 存放項(xiàng)目信息,默認(rèn)包含一個(gè)全局exclude文件, 用來(lái)放置不希望記錄在.gitignore 中的忽略模式

deion//文件- 僅供GitWeb 程序使用

hooks //目錄- 存放可在某些指令前后觸發(fā)運(yùn)行的鉤子腳本(hook s),默認(rèn)包含一些腳本樣例

refs//目錄- 存儲(chǔ)各個(gè)分支指向的目標(biāo)提交

branches //目錄- 還沒(méi)發(fā)現(xiàn)有什么用處

.git 目錄下可能還會(huì)包含其他文件,不過(guò)對(duì)于一個(gè)全新的倉(cāng)庫(kù),這將是你看到的默認(rèn)結(jié)構(gòu)。

其中有四個(gè)條目很重要:HEAD 文件、(尚未創(chuàng)建的)index 文件,和 objects 目錄、refs 目錄。這些條目是Git 的核心組成部分。

本地倉(cāng)庫(kù)剛剛新建,Git的三個(gè)區(qū)域都為空。

2.git add

在A倉(cāng)庫(kù)的工作目錄創(chuàng)建一個(gè)文件file.txt,寫(xiě)入內(nèi)容version 1,模擬需要管理的代碼文件。

執(zhí)行g(shù)it add,使用git status查看此時(shí)的狀態(tài)。

然后另外初始化一個(gè)空倉(cāng)庫(kù)B,嘗試用底層命令來(lái)實(shí)現(xiàn)以上效果。

創(chuàng)建相同內(nèi)容的file.txt,執(zhí)行 git hash-object,計(jì)算文件頭部信息+文件內(nèi)容的SHA-1編碼,執(zhí)行后顯示出40位的編碼結(jié)果。-w參數(shù)表示將內(nèi)容寫(xiě)入數(shù)據(jù)目錄。

查看寫(xiě)入到數(shù)據(jù)目錄的Git對(duì)象文件:

Git以SHA1編碼前兩位作為子目錄名,剩余位數(shù)作為文件名,存儲(chǔ)壓縮后的頭部信息和原文內(nèi)容。

可以通過(guò) cat-file 命令查看原始數(shù)據(jù)。為 cat-file 指定 -p 選項(xiàng)可使該命令自動(dòng)判斷源文件類(lèi)型。

這種存儲(chǔ)了數(shù)據(jù)原文的文件在Git對(duì)象中屬于blob (Binary Large Object)類(lèi)型。

此時(shí)Git的區(qū)域狀態(tài)如下:

使用git update-index 命令可以修改暫存區(qū),也就是.git/index文件。

由于此文件在暫存區(qū)沒(méi)有記錄,需要--add參數(shù)。

使用--cacheinfo參數(shù),直接寫(xiě)入數(shù)據(jù)文本。如果不加此參數(shù),僅使用git update-index --add file.txt 的方式,則與add命令效果完全相同。

本例中,我們指定的文件模式為100644,表明這是一個(gè)普通文件。其他選擇包括:100755,表示一個(gè)可執(zhí)行文件;120000,表示一個(gè)符號(hào)鏈接。Git的文件模式參考了常見(jiàn)的UNIX 文件模式,但比真正的文件系統(tǒng)簡(jiǎn)單許多。

此時(shí)暫存區(qū)index文件已經(jīng)生成,直接打開(kāi)會(huì)看到二進(jìn)制字符,可以用 ls-files 命令解析查看。

顯示出剛剛寫(xiě)入的內(nèi)容。

此時(shí)Git的區(qū)域狀態(tài)如下:

使用git status 查看,此時(shí)和A倉(cāng)庫(kù)狀態(tài)相同。

另外,由于 update-index --cacheinfo是直接寫(xiě)入文本,我們也可以添加完全不存在的對(duì)象名和文件名。

此時(shí)B倉(cāng)庫(kù)的狀態(tài):

3.git commit

回到A倉(cāng)庫(kù),在git add 的基礎(chǔ)上調(diào)用commit生成一個(gè)提交。

再查看暫存區(qū):

與status的提示不同,提交操作并不會(huì)實(shí)際清空暫存區(qū),其中始終保存著工作目錄的文件結(jié)構(gòu)。

再查看對(duì)象文件夾,發(fā)現(xiàn)兩個(gè)新增文件。

接下來(lái)我們?cè)诹硪粋€(gè)倉(cāng)庫(kù)重現(xiàn)這個(gè)操作。

回到B倉(cāng)庫(kù),繼續(xù)執(zhí)行 git write-tree。

git 會(huì)在此時(shí)檢查暫存區(qū)內(nèi)容和數(shù)據(jù)目錄中對(duì)象的對(duì)應(yīng)關(guān)系,剛剛添加的不存在的文件導(dǎo)致失敗。

git update-index --remove 命令可以從暫存區(qū)刪除這條信息,只有在工作目錄中不存在此文件時(shí),才允許從暫存區(qū)直接刪除相關(guān)信息。

write-tree 執(zhí)行成功后同樣返回40位哈希值,此命令將暫存區(qū)內(nèi)容寫(xiě)入數(shù)據(jù)目錄,生成一個(gè) tree類(lèi)型的對(duì)象。此對(duì)象也可以使用cat-file 命令查看。

使用剛剛生成的tree 對(duì)象來(lái)繼續(xù)生成commit 對(duì)象,查看內(nèi)容。

其中用戶(hù)信息使用 git config user.name 和 git config user.email 設(shè)置,僅對(duì)當(dāng)前倉(cāng)庫(kù)生效,如未指定則使用全局配置。

查看對(duì)象目錄:

和A倉(cāng)庫(kù)直接git commit生成的文件對(duì)比,發(fā)現(xiàn)其中一個(gè)文件名不同。這是由于commit對(duì)象中包含執(zhí)行時(shí)間信息,導(dǎo)致生成了不同的哈希編碼。

使用log命令可以看到一個(gè)普通的commit信息。

此時(shí)Git工作區(qū)域的狀態(tài):

繼續(xù)使用唯一的tree對(duì)象創(chuàng)建另一個(gè)提交。-p參數(shù)指定繼承關(guān)系,作為標(biāo)識(shí)符的hash值沖突概率較低,在git命令中通常使用前幾位簡(jiǎn)寫(xiě)表示。

有繼承關(guān)系的commit對(duì)象多出一條parent信息:

4.refs和HEAD

回到A倉(cāng)庫(kù),使用commit 增加C1提交。

檢查到暫存區(qū)并未修改,提交失敗??梢允褂?--allow-empty 參數(shù)放棄檢查。生成以下log。

可以發(fā)現(xiàn),打印的log信息和B倉(cāng)庫(kù)略有不同,并且B 倉(cāng)庫(kù)查看log時(shí)必須指定commit對(duì)象編碼。如果不指定就會(huì)出現(xiàn)以下錯(cuò)誤。

原因是之前用底層命令生成的提交鏈并不屬于任何分支。分支的本質(zhì)是指向commit對(duì)象的指針,hash編碼無(wú)意義難以記憶,分支名更方便靈活管理。

而HEAD 文件中保存著當(dāng)前工作目錄所在的分支,可以看到在B 倉(cāng)庫(kù)中,HEAD 指向默認(rèn)分支master,而 master 文件還不存在。

可以手動(dòng)生成 master文件,并指向最新提交。

雖然可以直接修改分支文件的內(nèi)容,但這是一種不安全的做法,可以使用git update-ref 命令來(lái)達(dá)成同一效果。

此時(shí)B倉(cāng)庫(kù)和A倉(cāng)庫(kù)的狀態(tài)就完全一致了。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)存儲(chǔ)

    關(guān)注

    5

    文章

    998

    瀏覽量

    51734
  • Git
    Git
    +關(guān)注

    關(guān)注

    0

    文章

    205

    瀏覽量

    16211
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    進(jìn)程類(lèi)型及三種狀態(tài)

    進(jìn)程類(lèi)型進(jìn)程的三種狀態(tài)
    發(fā)表于 04-02 07:06

    介紹下引腳的三種狀態(tài)

    介紹下引腳的三種狀態(tài)
    發(fā)表于 01-14 07:12

    功放管的三種工作狀態(tài)

    功放管的三種工作狀態(tài)低頻功率輸出級(jí)按功放管的工作狀態(tài)為甲類(lèi)、乙類(lèi)、丙類(lèi)三種。它們
    發(fā)表于 04-17 23:21 ?3719次閱讀

    功放極管的三種工作狀態(tài)工作狀態(tài)

    功放極管的三種工作狀態(tài)工作狀態(tài) 低頻功率輸出級(jí)按功放管的工作狀態(tài)為甲類(lèi)、乙類(lèi)、丙類(lèi)三種
    發(fā)表于 09-17 08:29 ?1.4w次閱讀
    功放<b class='flag-5'>三</b>極管的<b class='flag-5'>三種</b>工作<b class='flag-5'>狀態(tài)</b>工作<b class='flag-5'>狀態(tài)</b>

    功放管的三種工作狀態(tài)

    功放管的三種工作狀態(tài) 低頻功率輸出級(jí)按功放管的工作狀態(tài)為甲類(lèi)、乙類(lèi)、丙類(lèi)三種。 它們各有特點(diǎn):
    發(fā)表于 12-02 11:05 ?2631次閱讀

    極管三種工作狀態(tài)特點(diǎn)分析及判斷

    極管有放大、飽和、截止三種工作狀態(tài),放大電路中的極管是否處于放大狀態(tài)或處于何種工作狀態(tài),對(duì)于
    的頭像 發(fā)表于 09-28 09:11 ?19w次閱讀
    <b class='flag-5'>三</b>極管<b class='flag-5'>三種</b>工作<b class='flag-5'>狀態(tài)</b>特點(diǎn)分析及判斷

    態(tài)門(mén)輸出的三種狀態(tài)

    態(tài)指其輸出既可以是般二值邏輯電路,即正常的高電平(邏輯1)或低電平(邏輯0),又可以保持特有的高阻抗狀態(tài),那么態(tài)門(mén)輸出的三種
    的頭像 發(fā)表于 02-21 16:45 ?7.3w次閱讀

    電路的三種工作狀態(tài)分別是什么

    在學(xué)電子電路中,要學(xué)會(huì)分析電路,就從了解電路的三種狀態(tài)開(kāi)始。電路有哪三種狀態(tài):通路(負(fù)載)、短路、開(kāi)路(空載)三種
    的頭像 發(fā)表于 09-13 09:54 ?10.1w次閱讀

    解析Vivado的三種封裝IP的方式

    Vivado提供了三種封裝IP的方式:(1)將當(dāng)前工程封裝為IP;(2)將當(dāng)前工程中的BD(IPI 設(shè)計(jì))封裝為IP;(3)將指定的文件目錄封裝為IP。 IP Packager支持的輸入文件HDL
    的頭像 發(fā)表于 08-10 18:09 ?8147次閱讀
    <b class='flag-5'>一</b><b class='flag-5'>文</b><b class='flag-5'>解析</b>Vivado的<b class='flag-5'>三種</b>封裝IP的方式

    晶體管的三種工作狀態(tài)

    晶體管是一種重要的電子元件,廣泛應(yīng)用于現(xiàn)代電子設(shè)備中。它的工作狀態(tài)可以分為三種,包括截止狀態(tài)、放大狀態(tài)和飽和
    發(fā)表于 08-04 09:46 ?2205次閱讀

    電路的三種狀態(tài)

    ,再回到電源另端的電路稱(chēng)為外電路。 3、電路的三種狀態(tài) 電路有三種狀態(tài):通路、開(kāi)路和短路。通路就是電路中的開(kāi)關(guān)閉合,電路中有電流流過(guò);開(kāi)路
    的頭像 發(fā)表于 09-18 10:12 ?5533次閱讀

    繼電保護(hù)的三種狀態(tài)解析

    繼電保護(hù)的三種狀態(tài)解析? 繼電保護(hù)系統(tǒng)是電力系統(tǒng)中非常重要的個(gè)組成部分,其具有三種狀態(tài),包括:
    的頭像 發(fā)表于 09-27 16:00 ?3726次閱讀

    Git是如何存儲(chǔ)文件的?Git的工作原理解析

    我以為我已經(jīng)對(duì) Git 的工作方式了如指掌,但我以前從未真正涉及過(guò)打包文件,所以這次探索很有趣。我也很少思考當(dāng)我讓 git log 跟蹤個(gè)文件
    的頭像 發(fā)表于 10-31 15:36 ?873次閱讀

    晶體管的三種工作狀態(tài)

    晶體管作為現(xiàn)代電子技術(shù)的基石,其工作狀態(tài)直接影響電子設(shè)備的性能和功能。晶體管通常具備三種基本的工作狀態(tài):截止狀態(tài)、放大狀態(tài)和飽和
    的頭像 發(fā)表于 05-28 14:53 ?2791次閱讀

    mosfet的三種工作狀態(tài)及工作條件是什么

    的工作狀態(tài)及工作條件對(duì)于理解和設(shè)計(jì)相關(guān)電路至關(guān)重要。以下是MOSFET的三種主要工作狀態(tài)及其工作條件的介紹。 、MOSFET的三種工作
    的頭像 發(fā)表于 10-06 16:51 ?6171次閱讀