用Git來分析Git是怎么通過.git/來實現(xiàn)版本控制的


本還未完結(jié)队寇,目前更偏向自己的筆記滋戳,后期再整理。

新建一個空的GitStudy文件目錄倔约,然后使用git init對其初始化秃殉,此時這個文件目錄就被加入git管理了。本來這個是個空目錄浸剩,但是在執(zhí)行玩git init后我們發(fā)現(xiàn)里面有個.git的隱藏目錄(. ..這兩個是ubuntu自帶的)钾军。

frc@frc:~/GitHub/study/GitStudy$ ls -a
.  ..  .git

打開文件目錄,想看看里面的結(jié)構(gòu)绢要,發(fā)現(xiàn)一個個點好麻煩吏恭,此時就想到能不能在終端中顯示它的結(jié)構(gòu)樹,然后就在終端中輸入: tree .git/重罪,沒想到還真給提示了樱哼,說我沒有安裝tree哀九,需要安裝。sudo install tree就ok了唇礁,然后再執(zhí)行tree .git/

image.png

整體結(jié)構(gòu)一目了然勾栗,尤其最后一行9 directories, 14 files,告訴我們有9個目錄盏筐,14個文件围俘。
我們發(fā)現(xiàn)里面很多的目錄都是空的,而且有些文件名比較熟悉琢融,比如:HEAD界牡,config還有寫目錄名也挺熟悉的,比如:branchs , tags。

那么下面我們就要對GitStudy這個目錄做一些修改提交操作漾抬,然后看看.git目錄都做了哪些操作宿亡。怎么觀察改變呢,用git啊纳令。用git來監(jiān)控.git/目錄的改變挽荠。哈哈哈,是不是很天才平绩。如何來做呢圈匆,我們進入.git/目錄,然后**git init **就行了捏雌。

frc@frc:~/GitHub/study/GitStudy$ cd .git/

frc@frc:~/GitHub/study/GitStudy/.git$ ls
branches  config  description  HEAD  hooks  info  objects  refs

frc@frc:~/GitHub/study/GitStudy/.git$ git init
已初始化空的 Git 倉庫于 /home/frc/GitHub/study/GitStudy/.git/.git/

frc@frc:~/GitHub/study/GitStudy/.git$ ls -a
.  ..  branches  config  description  .git  HEAD  hooks  info  objects  refs

然后把里面的文件提交:

image.png

我們看到此時的./git目錄下也有了./git目錄跃赚。好吧下面回到GitStudy/我們創(chuàng)建一個REDME.txt文件,然后使用git status查看下狀況:

image.png

此時git告訴我們有個變更的文件性湿,然后我們進入.git/目錄纬傲,然后使用git status看下./git目錄有沒有變化:

frc@frc:~/GitHub/study/GitStudy$ cd .git/

frc@frc:~/GitHub/study/GitStudy/.git$ git status
位于分支 master
無文件要提交,干凈的工作區(qū)

此時它告訴我們并沒有什么改動肤频。
回到上級目錄叹括,我此時使用git add將REDME.txt文件加入暫緩區(qū)

frc@frc:~/GitHub/study/GitStudy$ git add REDME.txt 

此時再進入.git/目錄(暈了)宵荒,然后使用git status再看下:

image.png

哎领猾!讓哥逮著了吧『龋看看都有啥變動。瞅了下index打不開面粮,用命令行打開少孝,全是亂碼:

image.png

先放著。我們來看看objects/這個目錄熬苍。

image.png

我們發(fā)現(xiàn)多了個44的目錄稍走,而目錄下只保存了一串哈希值袁翁,難道這跟我提交的生成的commit_id的哈希值有關(guān)?(下面證明毛關(guān)系啊,只是個唯一標(biāo)識)

現(xiàn)在回到上級目錄婿脸,然后commit ,commit成功后git log看下里面的log信息:

frc@frc:~/GitHub/study/GitStudy$ git log
commit 40c72db34529598d5ecf5153f009589c04ed9048
Author: fengrongcheng <fengrongcheng2017@outlook.com>
Date:   Thu Jun 15 11:34:33 2017 +0800

    first commit

然后到.git/中使用用git status看下變更:

image.png

我們看到index文件被修改了粱胜,看下COMMIT_EDITMSG

image.png

是我剛才提交時的備注。
再看下logs/

image.png

看下HEAD:

image.png

看下組成:commit_id+作者+郵箱+時間+備注狐树。這個是不是和我們上面使用**git log **輸出的信息一樣焙压。
在看了下refs/heads/master 里面內(nèi)容一樣的。

下面再看下objects的變化

frc@frc:~/GitHub/study/GitStudy/.git$ tree  objects/
objects/
├── 40
│   └── c72db34529598d5ecf5153f009589c04ed9048
├── 44
│   └── bbec9e9b949e96bae4a10c33844e28c84f9aa4
├── d2
│   └── 4eb685594287d46e0c6717aee6466df9680d7f
├── info
└── pack

5 directories, 3 files

我們看到objects中比我們之前add后多了2個目錄:40抑钟,d2涯曲。而且他們里面的哈希值跟commit_id不一樣(40c72db34529598d5ecf5153f009589c04ed9048),所以我之前的猜測不對啊在塔。

繼續(xù)最后一個是refs幻件,進到它里面的master看下,里面就一行

40c72db34529598d5ecf5153f009589c04ed9048

終于找到個跟commit_id一樣的了蛔溃。

我們通過上面有很多不同路徑下相同名稱的文件绰沥,比如:refs,HEAD贺待,master徽曲。還有些空目錄。目測是因為我們操作太少狠持。

我們現(xiàn)在對REDME.txt再進行修改并提交疟位,再到.git/中看它的變化:

    修改:     COMMIT_EDITMSG
    修改:     index
    修改:     logs/HEAD
    修改:     logs/refs/heads/master
    修改:     refs/heads/master

未跟蹤的文件:
  (使用 "git add <file>..." 以包含要提交的內(nèi)容)

    objects/ce/
    objects/db/
    objects/92/

發(fā)現(xiàn)logs/HEAD和logs/refs/heads/master內(nèi)容一樣,保存了這兩次的提交信息:

0000000000000000000000000000000000000000 40c72db34529598d5ecf5153f009589c04ed9048 fengrongcheng <fengrongcheng2017@outlook.com> 1497497673 +0800        commit (initial): first commit
40c72db34529598d5ecf5153f009589c04ed9048 ce97d3ee3e85989f86e655c81a3d4d6a17461dfa fengrongcheng <fengrongcheng2017@outlook.com> 1497500926 +0800        commit: first change
~                                                                                     
~              

而COMMIT_EDITMSG則保存這最近一次的備注(以后叫commit_msg):

first change

refs/heads/master目錄下則是保存最近一次的commit_id:

ce97d3ee3e85989f86e655c81a3d4d6a17461dfa

objects目錄下又添加了三個哈希值喘垂。

我來看下現(xiàn)在.git/的結(jié)構(gòu):

frc@frc:~/GitHub/study/GitStudy$ tree .git/
.git/
├── branches
├── COMMIT_EDITMSG
├── config
├── description
├── HEAD
├── hooks
│   ├── applypatch-msg.sample
│   ├── commit-msg.sample
│   ├── post-update.sample
│   ├── pre-applypatch.sample
│   ├── pre-commit.sample
│   ├── prepare-commit-msg.sample
│   ├── pre-push.sample
│   ├── pre-rebase.sample
│   ├── pre-receive.sample
│   └── update.sample
├── index
├── info
│   └── exclude
├── logs
│   ├── HEAD
│   └── refs
│       └── heads
│           └── master
├── objects
│   ├── 40
│   │   └── c72db34529598d5ecf5153f009589c04ed9048
│   ├── 44
│   │   └── bbec9e9b949e96bae4a10c33844e28c84f9aa4
│   ├── 92
│   │   └── 516e223eaf9b259248fb774495c7f3c357e956
│   ├── ce
│   │   └── 97d3ee3e85989f86e655c81a3d4d6a17461dfa
│   ├── d2
│   │   └── 4eb685594287d46e0c6717aee6466df9680d7f
│   ├── db
│   │   └── 1e64707bd6061984b8db2f2c01a693a1a21a0e
│   ├── info
│   └── pack
└── refs
    ├── heads
    │   └── master
    └── tags

18 directories, 25 files

根據(jù)以上的嘗試能得出以下的結(jié)論:

  • COMMIT_EDITMSG:保存最近一次的commit_msg
  • refs/heads/master目錄下則是保存最近一次的commit_id:
  • **git add ** 會導(dǎo)致objects下生成一個哈希值
  • git commit會導(dǎo)致objects下生成兩個哈希值
  • logs/目錄下的HEAD是保存所有的log信息的

由于嘗試數(shù)據(jù)有限甜刻,得出結(jié)論可能不準。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末正勒,一起剝皮案震驚了整個濱河市得院,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌章贞,老刑警劉巖祥绞,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸭限,居然都是意外死亡蜕径,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進店門败京,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兜喻,“玉大人,你說我怎么就攤上這事赡麦∑咏裕” “怎么了帕识?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長遂铡。 經(jīng)常有香客問我肮疗,道長,這世上最難降的妖魔是什么扒接? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任伪货,我火速辦了婚禮,結(jié)果婚禮上珠增,老公的妹妹穿的比我還像新娘超歌。我一直安慰自己,他們只是感情好蒂教,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布巍举。 她就那樣靜靜地躺著,像睡著了一般凝垛。 火紅的嫁衣襯著肌膚如雪懊悯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天梦皮,我揣著相機與錄音炭分,去河邊找鬼。 笑死剑肯,一個胖子當(dāng)著我的面吹牛捧毛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播让网,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼呀忧,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了溃睹?” 一聲冷哼從身側(cè)響起而账,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎因篇,沒想到半個月后泞辐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡竞滓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年咐吼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片商佑。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡锯茄,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莉御,到底是詐尸還是另有隱情撇吞,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布礁叔,位于F島的核電站牍颈,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏琅关。R本人自食惡果不足惜煮岁,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涣易。 院中可真熱鬧画机,春花似錦、人聲如沸新症。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徒爹。三九已至荚醒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間隆嗅,已是汗流浹背界阁。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留胖喳,地道東北人泡躯。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像丽焊,于是被迫代替她去往敵國和親较剃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

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

  • 本片內(nèi)容轉(zhuǎn)自CSDN http://blog.csdn.net/ithomer/article/details/7...
    五娃兒閱讀 4,933評論 2 88
  • 以下筆記主要參考gitgot粹懒,大致了解git使用和原理重付。 第一部分我們從個人的視角去研究如何用好Git,并且揭示G...
    carolwhite閱讀 2,375評論 0 1
  • ——記2016年中班的暑假 這滿眼的淚水凫乖,因為:跳舞确垫。 ?千辛萬苦才能實現(xiàn)的愿望 悠悠的“興趣”非常廣泛,想“學(xué)”...
    洋娃娃2011閱讀 253評論 0 0
  • 以往平常心態(tài)帽芽, 猛咽火鍋中菜删掀。 持酒飲群豪, 更為眼前稱快导街。 廬怪披泪, 廬怪, 一會方知嗨派搬瑰。
    李緩之閱讀 382評論 35 67
  • 不后悔款票,莫過于做好三件事:一是知道如何選擇控硼;二是明白如何堅持;三是懂得如何珍惜艾少。有些事卡乾,挺一挺,就過去了...
    檸檬味的金桔閱讀 138評論 0 1