chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

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

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

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

掃碼添加小助手

加入工程師交流群

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

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

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

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

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

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

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

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

下面新建兩個空倉庫A 和B,來觀察隱藏在Git常見命令下的實際執(zhí)行過程。

1.git init

此命令初始化一個新本地倉庫,它在工作目錄下生成一個名為.git的隱藏文件夾。

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

config//文件- 包含一些配置選項

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

HEAD//文件- 指定當前分支

info //目錄- 存放項目信息,默認包含一個全局exclude文件, 用來放置不希望記錄在.gitignore 中的忽略模式

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

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

refs//目錄- 存儲各個分支指向的目標提交

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

.git 目錄下可能還會包含其他文件,不過對于一個全新的倉庫,這將是你看到的默認結(jié)構(gòu)。

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

本地倉庫剛剛新建,Git的三個區(qū)域都為空。

2.git add

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

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

然后另外初始化一個空倉庫B,嘗試用底層命令來實現(xiàn)以上效果。

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

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

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

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

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

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

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

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

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

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

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

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

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

使用git status 查看,此時和A倉庫狀態(tài)相同。

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

此時B倉庫的狀態(tài):

3.git commit

回到A倉庫,在git add 的基礎上調(diào)用commit生成一個提交。

再查看暫存區(qū):

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

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

接下來我們在另一個倉庫重現(xiàn)這個操作。

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

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

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

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

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

其中用戶信息使用 git config user.name 和 git config user.email 設置,僅對當前倉庫生效,如未指定則使用全局配置。

查看對象目錄:

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

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

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

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

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

4.refs和HEAD

回到A倉庫,使用commit 增加C1提交。

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

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

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

而HEAD 文件中保存著當前工作目錄所在的分支,可以看到在B 倉庫中,HEAD 指向默認分支master,而 master 文件還不存在。

可以手動生成 master文件,并指向最新提交。

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

此時B倉庫和A倉庫的狀態(tài)就完全一致了。

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

    關(guān)注

    5

    文章

    999

    瀏覽量

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

    關(guān)注

    0

    文章

    205

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

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

    進程類型及三種狀態(tài)

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

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

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

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

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

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

    功放極管的三種工作狀態(tài)工作狀態(tài) 低頻功率輸出級按功放管的工作狀態(tà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) 低頻功率輸出級按功放管的工作狀態(tài)為甲類、乙類、丙類三種。 它們各有特點:
    發(fā)表于 12-02 11:05 ?2631次閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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