同学们好,我已经在上个视频中教授大家git add命令和git commit命令,并且已经走过了这个流程。在这个视频中,我们需要了解通过这两步对于点git隐藏目录发生了哪些变化。为了方便观看,我们再开设一个窗口。
首先我们进入gitcode目录,然后打印点git目录文件结构,我们可以看到里面确实发生了一些改变。首先我们需要了解通过add操作后会形成暂存区,名为index。在点git目录下新生成一个index,add之后的内容都添加到这里。Index看完之后,我们还需要查看head,之前告诉大家它是一个指针指向master,我们稍后也需要查看master里面的内容,首先我们需要确认head指针是否指向master。
我们cat .git下的head,发现指向refs heads下的master。这个路径在我们的.git路径下可以看到,我们向下翻一下,下面有一个refs heads下的master。找到master之后,我们再打印master里面的内容,点git下的refs heads master,打印出来之后发现它是一串字符串。细心的同学发现master里面存放的是我们最新一次提交的commit ID。
我们回到这张图片上查看,我们之前告诉大家,master它里面存放的都是一些索引,这些索引指向的是我们对象库中的一个对象,所以commit ID它实际上就是一个.git中的对象,我们可以理解。这个对象如何查看,首先我们需要找到objects。这次果然更新了一堆对象,在目录上它就是一些文件,我们也可以把它称之为对象。
首先我们需要将commit ID分为两部分,前两位是文件夹名称,即38。这里有38后面跟上的内容,97开头的内容以BD16结尾。我们找到它之后查看对象内部的具体情况,不能直接使用cat。这次想查看对象内容,使用的命令是git cat-file后面跟上一个杠p选项,即更优雅、更漂亮地打印出内容。我们需要打印的对象是哪个,就复制哪个的commit ID。
回车后我们可以看到它确实打印了一些内容。我们可以看到最下面的add三file,即我们最新提交的内容。这些描述信息是我们自己写的,另外我们也打印了一些内容。包括parent,它是我们上次提交的commit ID。这是58,我们可以在log中看到,它上次提交的确实是58开头,以7CD1结尾。另外一个我们不认识的名字叫tree,tree后面又跟了一串,它是什么意思,也是一个对象,我们不懂可以把它打印出来,复制一下commit ID。我们重新get cat-file,-p选项。打印完成后我们发现给我们4行提示,首先readme是我们自己的文件,还有file1file2file3都是我们之前提交的文件。每个文件对应一个commit ID也就是索引,我们可以使用cat-file查看对象内容。
我们先观察readme对应的commit ID。我们可以看到这些commit ID都是一个对象,可以在objects里面找到。例如,8d......,我们接下来进行打印。
git cat-file -p选项,我们将其复制粘贴。我们可以看到它打印了一行内容,这一行内容是什么?
我们修改readme文件时,新增的内容被它打印出来了。这是我们对readmit文件进行的一次修改,被git记录下来了。因此每次提交的修改都会被git记录,它通过对象记录下来的修改。
我们回顾objects中,他修改了工作区的内容并且将其写入对象中。我们已经查看过这个对象,并且将其放入了他维护的objects对象库中。
接下来我将总结。首先,在git仓库中有一个index,它存放add之后新增的内容,是暂存区。另外,还有一个head,它是指针指向refs heads下的master。
Master中存放的是我们最新提交的commit ID,它是一个索引,对应的是git对象,这个对象被维护在了对objetcs象库中,我们也查看到了最终结果。它里面存放我们所有修改的内容,hello git都被我们打印出来了。