赞
踩
首先我们创建两个文件交给git管理
git init
echo 'aaa'>a.txt
echo 'bbb'>b.txt
git add *.txt
执行完上述几条命令后,git会将整个数据库储存在.git/目录下,此时我们可以查看.git/objects目录,会发现多了两个object。
可能有人就会好奇这两个文件是什么,不要着急,我们一一查看。
我们先来通过cat命令查看,结果如下:
我们可以看出存储的是一堆被压缩的二进制文件,如果大家还记得什么类型的文件适合存储二进制文件,那大家应该可以想到,这个文件大概是blob类型的。
git也很贴心的给了我们查看文件的api工具:
git cat-file [-t] [-p] 文件id
//-t:查看object的类型
//-p:查看object内容
我们通过上面的命令查看一下,结果如下
我们可以看到,该object是一个blob类型的节点,内容为aaa。这个object只存储a.txt的内容,并没有存储文件名/权限等信息,那么这些信息存储在哪里呢,为什么不存储在这里呢?看完就知道啦!!!
此时我们可以明确看到Git仓库就是下图的样子:
我们将刚才add的文件,进行commit提交。
git commit -m 'init'
上图就是进行commit操作打印的一些信息,可以有个简单的了解,commit之后让我们继续查看.git/objects目录如下:
我们发现 commit 完之后,仓库又多出来了两个object文件,我们分别查看两个文件
如上图,86ca文件类型为commit,存储的是 commit 信息
如上图,65b7文件类型为tree,从存储的内容来看,它存储的是一个目录结构,以及每一个文件的权限,类型,SHA1值,文件名。
到这里,我们可以发现这四个objec的关系,我们可以通过查看 commit 信息 > tree信息 > 具体文件。
现在关系基本明朗,我们可以先查看一下分支信息。
在git中,HEAD,分支,tag等信息都类似于一个指针,只想我们的commit信息。
看到这里,相信大家都明白了 Git 的本质其实就是一个key-value的数据库加上树结构的有向无环图。
Git的三个分区(工作目录、Index索引区、Git库)。
工作目录:
操作系统上的文件,所有代码开发编辑都在这上面完成。
Index索引区
一个暂存区域,这里面的代码会在下一次 commit 时被提交到Git仓库。
Git仓库
由 Git object 记录着每一次的快照,以及链式结构记录的提交变更历史。
接着第一部分的例子,我们此时的各分区如下图:
我们想查看工作空间的变化,最简便的可以按如下进行操作:
修改 a.txt 内容》执行 add 》执行 commit
修改 a.txt 文件内容为ccc
echo 'ccc'>a.txt
在修改完 a.txt 文件后,此时的各分区情况如下,索引区和Git仓库均没有变化。
执行 add 操作
git add a.txt
执行完 add 操作后,将 a.txt 添加到索引区域,此时 git 在仓库里面新建了一个 blob object 用于存储新的文件内容,并且更新了索引,将 a.txt 指向了新建的object。此时各分区如下图:
执行 commit 操作
git commit -m 'update ccc'
执行完 commit 操作后会发生一下三个操作:
1) Git首先会根据当前索引生成一个 tree object,充当新提交的一个快照;
2) 创建一个新的 commit object ,将这次 commit 信息储存起来,并且 parent 指向上一个 commit 组成一条链记录变更历史。
3) 将 master 分支的指针移到新的 commit 节点。
此时各分区情况如下图:
好了,至此关于git的基本可视化应该就能在我们脑海中出现了吧。看到这里,不知道还记不记得上面提到的几个问题呢?
commit message格式: <type>(<scope>): <subject>
例子:
feat(Controller): 用户拥有权限查询
fix(*): 用户权限查询异常调整
寓教于乐,如果关于git的基本命令还是不太清楚的,或者不能实现git可视化的,可以登录下面这个关于 Git 小游戏的链接,一层层闯关,一路打怪升级。
Git 游戏链接:https://learngitbranching.js.org/?demo=&locale=zh_CN
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。