Git托管项目的.git目录下都有什么?

我们在使用git托管项目代码时,如果是新建项目需要通过git init命令在项目根目录下初始化.git目录来实现后续的代码托管管理,如果直接从代码仓库拉取代码则会自动创建.git目录与远程仓库进行绑定。

.git目录结构

首先我们先来看看.git这个目录的结构是什么样子的,如下所示:

⋊> ~/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是当前活动分支的游标指向,我们可以查看下该文件的内容:

⋊> ~/s/g/.git on master ⨯ cat HEAD                                                                                                                                                                                                                                                                     11:17:22
ref: refs/heads/master

可以看到HEAD文件目前指向master分支,而master分支则位于refs/heads目录下,我们接下来可以去refs目录下看看都有哪些内容。

refs目录

refs目录存储了一些引用指向,我们在使用branchtag时大多数都是引用到该目录下,然后再指向具体的objects

refs目录结构如下所示:

⋊> ~/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内全部目录的文件都是存储的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命令我们可以查看该文件的内容,发现该文件的内容是一长串的字符编号,如果想要知道这个一长串字符编号是什么我们可以通过git cat-file命令来查看类型以及详细内容,如下所示:

# -t 参数查看文件的类型
⋊> ~/s/g/.g/r/heads on master ⨯ git cat-file -t 33248b733e36a495ea3691f2d1291c5e77633229                                                                                                                                                                                                               09:32:11
commit
# -p 参数查看该文件的详细内容
⋊> ~/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

添加默认值

通过git cat-file -t命令我们发现33248b733e36a495ea3691f2d1291c5e77633229文件是一个commit类型的objects,通过git cat-file -p命令就可以查看该文件的详细内容了。

我们从文件内容来看可以猜测出该文件应该是对应的master分支的最后一次提交的commit,我们可以通过git branch -av命令来查看每个分支的情况,如下所示:

⋊> ~/s/g/.g/r/heads on master ⨯ git branch -av                                                                                                                                                                                                                                                         09:07:59
* master                33248b7 添加默认值
  remotes/origin/master 33248b7 添加默认值

发现本地master分支指向了33248b7,也就是我们刚才cat master内容33248b733e36a495ea3691f2d1291c5e77633229的缩写,这样我们就明白了,master文件内存储了最新提交的指向。

tags

该目录下存储了全部的tag文件,每个tag文件也是存储了objects指向,一般tag是基于commit来打的所以指向跟commit一致。

我们项目中有个temptag,我们可以查看下该文件的类型以及内容:

⋊> ~/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

我们发现temp分支文件内存储的指向也是33248b733e36a495ea3691f2d1291c5e77633229temp标签是基于master分支最新commit打的,所以tagobjects指向与master分支的指向是一致的。

config文件

.git目录下有个config文件,存放了该仓库的配置信息,内容如下:

[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

该文件内定义了一些核心参数配置、远程分支信息、本地分支列表等,我们通过git config --local 也可以为该仓库配置参数,如下所示:

git config --local user.name '恒宇少年'
git config --local user.email 'jnyuqy@gmail.com'

通过上面命令配置后再.git/config文件内就会添加对应的配置内容:

[user]
        name = 恒宇少年
        email = jnyuqy@gmail.com

总结

git远比我们想的强大,本文章是一个入门篇,应对工作中遇到的各种问题后续针对git还回详谈,熟练的运用git让我们在协同开发过程中不再有冲突恐惧症

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 142,061评论 1 300
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 60,947评论 1 255
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 93,744评论 0 211
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 40,878评论 0 175
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 48,601评论 1 255
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,696评论 1 175
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,324评论 2 267
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,120评论 0 165
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 28,921评论 6 229
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,459评论 0 213
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,234评论 2 214
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,558评论 1 226
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,203评论 0 31
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,088评论 2 213
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,460评论 3 204
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,604评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 25,975评论 0 166
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,460评论 2 230
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,536评论 2 229

推荐阅读更多精彩内容