欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

3天內不再提示

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

張康康 ? 來源:陳翠 ? 2019-07-29 18:27 ? 次閱讀

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

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

任何數據存儲前始終使用SHA-1計算校驗和,保證內容完整性。

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

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

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

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

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

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

1.git init

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

查看該文件夾結構:

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

objects//目錄- 存儲所有Git的數據對象

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

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

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

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

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

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

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

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

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

2.git add

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

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

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

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

查看寫入到數據目錄的Git對象文件:

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

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

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

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

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

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

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

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

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

顯示出剛剛寫入的內容。

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

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

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

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

3.git commit

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

再查看暫存區(qū):

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

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

接下來我們在另一個倉庫重現這個操作。

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

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

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

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

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

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

查看對象目錄:

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

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

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

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

有繼承關系的commit對象多出一條parent信息:

4.refs和HEAD

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

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

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

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

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

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

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

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

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

    關注

    5

    文章

    986

    瀏覽量

    51118
  • Git
    Git
    +關注

    關注

    0

    文章

    201

    瀏覽量

    15829
收藏 人收藏

    評論

    相關推薦

    進程類型及三種狀態(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 ?3535次閱讀

    功放極管的三種工作狀態(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 ?2579次閱讀

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

    極管有放大、飽和、截止三種工作狀態(tài),放大電路中的極管是否處于放大狀態(tài)或處于何種工作狀態(tài),對于
    的頭像 發(fā)表于 09-28 09:11 ?18.9w次閱讀
    <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.2w次閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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