本還未完結(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/
整體結(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
然后把里面的文件提交:
我們看到此時的./git目錄下也有了./git目錄跃赚。好吧下面回到GitStudy/我們創(chuàng)建一個REDME.txt文件,然后使用git status查看下狀況:
此時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再看下:
哎领猾!讓哥逮著了吧『龋看看都有啥變動。瞅了下index打不開面粮,用命令行打開少孝,全是亂碼:
先放著。我們來看看objects/這個目錄熬苍。
我們發(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看下變更:
我們看到index文件被修改了粱胜,看下COMMIT_EDITMSG:
是我剛才提交時的備注。
再看下logs/
看下HEAD:
看下組成: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é)論可能不準。