Git,哆啦A梦的时光机(二)

 上一篇介绍了Git的作用和优势,本篇就仔细说一说Git到底是什么。

      1、到底什么是Git?

  • 组成部分

      进入Git官网直接下载安装,https://git-scm.com/downloads

      

      如图所示为Git目录,最外面一级目录为工作区和本地仓库。

      点开.git文件,可以看到本地仓库的内核:

    

    不是很理解官方为什么要把git分为工作区、暂存区和本地仓库三部分,个人见解是:按照“工作区+本地仓库(文件库+暂存区+其他)“这样子的划分可能会更清晰一些。

  • Git网络

      单个Git非常简单,当存在于不同电脑或服务器上的Git之间相互联系,就组成了Git的网络,我们就在这个体系中交流和共享信息,最终推动项目向前发展。

       2、工作区

     工作区就是我们平时操作文件、完成项目的区域,如上图的Git-Test文件,就是一个java项目。工作区存放的对象可以是从本地仓库中提取出来的文件,也也可以是自己创建编辑且尚未提交入仓库的文件。

      总之工作区就像一个暴露的接口,让开发人员能够对文件进行操作,而不用去关心整个Git具体是怎么运作的。

      3、本地仓库和远程仓库

  • 仓库是个什么鬼?

     仓库,顾名思义就是用来存东西的,我们可以把它理解成数据库。git的本地仓库就是.git这个文件夹,而仓库中储存数据文件的区域则是该目录下的objects文件夹。

   当我们暂存或提交文件(git add/git commit)的时候,git会把文件存放到objects中并封装起来,自动计算出一个与文件对应的校验和作为文件

    

      如上图所示"2a+f23c59e2358154b473160beb6104b32168dfef"这个40位的字符串就是一个校验和,玩过MongoDB的同学也一定非常熟悉,我们每次存入数据的时候都会自动生成一长串字符串作为主键,其实和这个原理相同。

       为了方便收纳管理,git把校验和的前2位单独拿出来作为文件夹,后38位则作为文件名,校验和前两位碰巧相同的文件就会被放在同一个文件夹中。git的本质其实可以这么认为:这一长串字符串就是一个key,而我们真正add的文件就是value。使用这个key,我们可以通过"git cat-file -p+ key"指令非常方便的在仓库中提取出我们提交的文件内容。

  • 啥叫远程和本地?

       本地和远程是相对的概念。你一旦在自己电脑上安装了git并完成了初始化,就拥有了一个.git文件,可以理解为一个空的数据库。这样,如果你从另一个数据库里拉取东西,也就是从远程拉取东西,那个数据库也就叫做远程仓库。举个栗子,你可以在自己电脑上初始化两个仓库,一个仓库从另一个仓库拉东西,在那个时点,被拉的仓库就是远程仓库。这和它存在于本地还是在网络上无关。

      虽然远程和本地的具体实例并不确定,但在通常情况下,我们都是在github服务器上创建仓库作为远程仓库,而在本机上创建仓库作为本地仓库。

       4、暂存区

         暂存区(staging area),又叫做index区,其实就是.git目录下的index文件。

     当我们对文件进行修改后,会使用add指令暂存文件,这时工作区改动的文件数据就会被封装,并加入到本地仓库中, 同时git会把这个文件的校验和存入到index文件中。一旦工作区文件被加入了暂存区,它就被纳入了git的管理范围。

  • 为什么要设置暂存区?

      我认为有两个原因:

    • 提供跟踪机制

     git会根据index中存放的校验和和时间戳对工作区的文件进行实时校验比对,以提示开发人员那些尚未暂存的修改。

    • 提交前的准备

       就像照相一样,每次拍照之前你需要取景、调节光圈快门白平衡这一系列的准备工作,而暂存区就是用来准备和缓存这些操作的,直到最终做好了准备,按下快门(commit)。

       有了暂存区,git会把index文件中保存的零散是文件校验和组织起来,做成统一的文件目录,最终在你提交(commit)的时候向仓库中存入这个目录。这个过程就是准备快照的过程。

        5、总结

      综上所述,经过实际测试和追踪证明,本地操作时的Git为我们做的事情应该如下所示:

      (假设A项目由2个文件:文件1和文件2组成)

         step1:开发者修改文件1

        step2:开发者使用git add将修改后的文件1加入仓库(objects文件夹),同时生成校验和,存入暂存区(index文件)中。

          step3:开发者修改文件2

          step4:同step2

  step5:项目已经修改完毕,开发者使用commit指令,git会将文件1和文件2组合成项目A(生成快照),并计算校验和,把快照保存到仓库中。

         step6:最终我们提取项目时不需要再单独把文件1和2提取出来,直接使用校验和提取项目A即可。

猜你喜欢

转载自www.cnblogs.com/mrpour/p/11222438.html