我們在使用git托管項目代碼時,如果是新建項目需要通過git init命令在項目根目錄下初始化.git目錄來實現(xiàn)后續(xù)的代碼托管管理,如果直接從代碼倉庫拉取代碼則會自動創(chuàng)建.git目錄與遠程倉庫進行綁定。
.git目錄結(jié)構(gòu)
首先我們先來看看.git這個目錄的結(jié)構(gòu)是什么樣子的,如下所示:
?> ~/s/g/.git on master ? pwd 10:24:08
/Users/yuqiyu/study/git-chapter/.git
?> ~/s/g/.git on master ? ll 10:24:09
total 64
-rw-r--r-- 1 yuqiyu staff 16B May 26 13:51 COMMIT_EDITMSG
-rw-r--r-- 1 yuqiyu staff 91B May 27 11:20 FETCH_HEAD
-rw-r--r-- 1 yuqiyu staff 23B May 26 13:33 HEAD
-rw-r--r-- 1 yuqiyu staff 41B May 26 13:50 ORIG_HEAD
drwxr-xr-x 2 yuqiyu staff 64B May 19 09:07 branches/
-rw-r--r-- 1 yuqiyu staff 361B May 29 09:31 config
-rw-r--r-- 1 yuqiyu staff 73B May 19 09:07 description
drwxr-xr-x 13 yuqiyu staff 416B May 19 09:07 hooks/
-rw-r--r-- 1 yuqiyu staff 751B May 26 13:51 index
drwxr-xr-x 3 yuqiyu staff 96B May 19 09:07 info/
drwxr-xr-x 4 yuqiyu staff 128B May 19 09:08 logs/
drwxr-xr-x 127 yuqiyu staff 4.0K May 27 11:20 objects/
drwxr-xr-x 6 yuqiyu staff 192B May 25 16:17 refs/
-rw-r--r--@ 1 yuqiyu staff 174B May 27 11:20 sourcetreeconfig
?> ~/s/g/.git on master ?
HEAD文件
HEAD是當(dāng)前活動分支的游標(biāo)指向,我們可以查看下該文件的內(nèi)容:
?> ~/s/g/.git on master ? cat HEAD 11:17:22
ref: refs/heads/master
可以看到HEAD文件目前指向master分支,而master分支則位于refs/heads目錄下,我們接下來可以去refs目錄下看看都有哪些內(nèi)容。
refs目錄
refs目錄存儲了一些引用指向,我們在使用branch、tag時大多數(shù)都是引用到該目錄下,然后再指向具體的objects。
refs目錄結(jié)構(gòu)如下所示:
?> ~/s/g/.g/refs on master ? pwd 11:26:27
/Users/yuqiyu/study/git-chapter/.git/refs
?> ~/s/g/.g/refs on master ? ll 11:26:28
total 8
drwxr-xr-x 3 yuqiyu staff 96B May 26 13:51 heads/
drwxr-xr-x 3 yuqiyu staff 96B May 25 16:17 remotes/
-rw-r--r-- 1 yuqiyu staff 41B May 19 10:12 stash
drwxr-xr-x 3 yuqiyu staff 96B May 29 09:36 tags/
refs內(nèi)全部目錄的文件都是存儲的objects引用,我們下面以heads目錄為例
heads
該目錄下存放該項目在本地全部的分支,每個分支文件存儲了commit id,如下所示:
?> ~/s/g/.g/refs on master ? cd heads/ 09:01:37
?> ~/s/g/.g/r/heads on master ? ls 09:03:13
master
?> ~/s/g/.g/r/heads on master ? cat master 09:03:13
33248b733e36a495ea3691f2d1291c5e77633229
通過cat master命令我們可以查看該文件的內(nèi)容,發(fā)現(xiàn)該文件的內(nèi)容是一長串的字符編號,如果想要知道這個一長串字符編號是什么我們可以通過git cat-file命令來查看類型以及詳細(xì)內(nèi)容,如下所示:
# -t 參數(shù)查看文件的類型
?> ~/s/g/.g/r/heads on master ? git cat-file -t 33248b733e36a495ea3691f2d1291c5e77633229 09:32:11
commit
# -p 參數(shù)查看該文件的詳細(xì)內(nèi)容
?> ~/s/g/.g/r/heads on master ? git cat-file -p 33248b733e36a495ea3691f2d1291c5e77633229 09:59:48
tree 026567e8fe35ef942c1ea7f833799f26027d964f
parent d78e592e663b2a34da826810303bd75f671a84af
author 恒宇少年 <39233436+hengboy@users.noreply.github.com> 1653544281 +0800
committer 恒宇少年 <39233436+hengboy@users.noreply.github.com> 1653544281 +0800
添加默認(rèn)值
通過git cat-file -t命令我們發(fā)現(xiàn)33248b733e36a495ea3691f2d1291c5e77633229文件是一個commit類型的objects,通過git cat-file -p命令就可以查看該文件的詳細(xì)內(nèi)容了。
我們從文件內(nèi)容來看可以猜測出該文件應(yīng)該是對應(yīng)的master分支的最后一次提交的commit,我們可以通過git branch -av命令來查看每個分支的情況,如下所示:
?> ~/s/g/.g/r/heads on master ? git branch -av 09:07:59
* master 33248b7 添加默認(rèn)值
remotes/origin/master 33248b7 添加默認(rèn)值
發(fā)現(xiàn)本地master分支指向了33248b7,也就是我們剛才cat master內(nèi)容33248b733e36a495ea3691f2d1291c5e77633229的縮寫,這樣我們就明白了,master文件內(nèi)存儲了最新提交的指向。
tags
該目錄下存儲了全部的tag文件,每個tag文件也是存儲了objects指向,一般tag是基于commit來打的所以指向跟commit一致。
我們項目中有個temp的tag,我們可以查看下該文件的類型以及內(nèi)容:
?> ~/s/g/.g/refs on master ? cd tags/ 10:13:42
?> ~/s/g/.g/r/tags on master ? ls 10:13:43
temp
?> ~/s/g/.g/r/tags on master ? cat temp 10:13:44
33248b733e36a495ea3691f2d1291c5e77633229
?> ~/s/g/.g/r/tags on master ? git cat-file -t 33248b733e36a495ea3691f2d1291c5e77633229 10:13:46
commit
我們發(fā)現(xiàn)temp分支文件內(nèi)存儲的指向也是33248b733e36a495ea3691f2d1291c5e77633229,temp標(biāo)簽是基于master分支最新commit打的,所以tag的objects指向與master分支的指向是一致的。
config文件
在.git目錄下有個config文件,存放了該倉庫的配置信息,內(nèi)容如下:
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[remote "origin"]
url = git@gitee.com:hengboy/git-chapter.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
該文件內(nèi)定義了一些核心參數(shù)配置、遠程分支信息、本地分支列表等,我們通過git config --local 也可以為該倉庫配置參數(shù),如下所示:
git config --local user.name '恒宇少年'
git config --local user.email 'jnyuqy@gmail.com'
通過上面命令配置后再.git/config文件內(nèi)就會添加對應(yīng)的配置內(nèi)容:
[user]
name = 恒宇少年
email = jnyuqy@gmail.com
總結(jié)
git遠比我們想的強大,本文章是一個入門篇,應(yīng)對工作中遇到的各種問題后續(xù)針對git還回詳談,熟練的運用git讓我們在協(xié)同開發(fā)過程中不再有沖突恐懼癥。