文章概述
上文中,我们聊了聊git的配置与一些基本概念,今天来看看.git文件夹里面有什么内容。通过阅读本文,你将获得下面的知识:
- .git的内部信息。
- git的分支操作。
- 图形化git工具。
新建分支
我看可以通过git branch
查看分支情况。
* master
当前只有一个master分支,我们可以通过命令 git checkout -b 分支名称
来创建一个新的分支。 我们创建一个名叫temp的分支git checkout -b temp
,再次通过git branch
查看分支情况。
master
*temp
我们对git.txt 随便做些修改,进行提交。
git add git.txt
git commit -m "第一次在分支上提交"
git log
我们再切换master分支,增加一次提交。
git checkout master
# 修改git.txt
git add git.txt
git commit -m "git in master"
我现在我们有两个分支了,我们可以通过上一节讲到的log命令看一下log结构。
下面我们用图形化工具更加具体的看一下当前我们仓库的提交情况。
gitk图形化工具
git默认是自带了图形化工具,在终端输入gitk
。即刻打开图形化工具。
通过设置:视图
-> 新视图
-> 勾选所有引用
就可以看到我上图的提交。
gitk长得比较丑陋,但是他有很多实用的工具,你自己可以探索一下。正式的项目中我比较推荐使用sourceTree
这个工具进行代码管理。下面我们一起看看.git目录里的信息。
.git目录探秘
执行如下命令:
cd .git
cat HEAD
# ref: refs/heads/master 输出信息
HEAD里存放的是当前分支,如果我们将分支切到temp,HEAD里面的内容就变成了temp。
cd .
git checkout temp # 切换到分支 'temp'
cat .git/HEAD
# ref: refs/heads/temp
看完了HEAD的内容,我们看一下refs
目录的结构,它下面有两个文件其中,heads存放分支信息,tags存放标签信息。
cat master
# 9cb473a4ce3f4f9af213406c0177879155dced5c #这个就是master分支的最上面的一次提交id.
git cat-file -t 9cb473a4ce3f4f9af213406c0177879155dced5c # 查看类型
# commit
git cat-file -p 9cb473a4ce3f4f9af213406c0177879155dced5c # 查看内容
# tree c12315fe585a553da1fb7ee853bc84111eb8844d
# parent 6ec84005eb61d5ab8b4b768b8f876a23cc8fc2e1
# author zs_local <zs_local@163.com> 1585831559 +0800
# committer zs_local <zs_local@163.com> 1585831559 +0800
# git in master
我们接下来再看一下objects目录里面的内容。
cd objects # 进入到objects目录
ls # 查看objects目录下的内容
# 10 21 41 51 68 72 96 ae cf info
# 1b 31 4f 5e 6e 82 9c c1 d5 pack
cd 51 # 进入51目录
ls #查看该目录下的内容
# ee9c49370ad551e5fd3e8c98b8a89918369439
git cat-file -t 51ee9c49370ad551e5fd3e8c98b8a89918369439 # 查看类型,文件名是 目录名+目录内文件名
# tree
git cat-file -p 51ee9c49370ad551e5fd3e8c98b8a89918369439 # 查看文件内容 # blob
# 100644 blob 3155fb8c6c13dd5a42827e8e2fddb6eec1079385 git.txt
git cat-file -p 3155fb8c6c13dd5a42827e8e2fddb6eec1079385 #查看blob内容
# Hello git in temp branch%
根据上面的一顿操作,我们可以看出几个关键概念,commitid
、 tree
、blod
。 下面我们讲一下他们三个之间的关系:
- 1个commit对象里面会包含有 tree(相当于文件夹)、parent、author和committer;
- 一个tree里面会包含tree和blog(具体的内容);
- 一个blog指的就是具体的文件内容。在git中,blog与文件名无关,只与文件内容有关,即文件内容相同,在git中是同一个blog。
总结一下.git目录里面的内容:
- HEAD 存放当前所在分支的头节点
- config存放该仓库的一些配置信息,比如用户名,电子邮件,这点我们在第一节中讲过。
- refs 下存放在heads和tags,分别存储着分支信息和标签信息。
- objects目录存储放着所有的git变更历史对应的具体内容信息。
- hooks中存放着对git操作的一些勾子操作,后面会讲到。