【青训营】Git的使用|青训营笔记

120 阅读7分钟

这是我参与[第三届青训营-后端场]笔记创作活动的第三篇笔记

介绍

在我们的日常项目中,由于体量往往会比较小,一个人两个人就能够hold住整个项目的开发进度,这个时候我们也许并不需要这样一个版本控制的工具来帮助我们更好的沟通协作,但是当一个项目开始变得复杂起来,往往就不是一两个人就可以短期之内解决的了的,所以自然而然,当小组成员增长,每个人之间的代码如何协作,如何更好的管理好团队的开发项目,就成为了一个比较重要的问题。关于这一类的问题,有出现过那么几类工具:

  1. RCS本地版本控制
  2. SVN集中版本控制
  3. Git分布式版本控制 最早的RCS是提供给本地开发的,所有的项目仅在本地存有版本信息,并不能够很好的供小组成员协作开发,所以中间一度使用SVN来作为主要的团队开发的版本控制工具,它提供了一个远端服务器来存储代码的各个版本,事实上这也是一个不错的版本控制工具,它采用的是增量提交,每次提交会记录代码的增量,所以整体的体积会相对较小,但是由于它对于分支的管理并不太友好,所以仍旧具有局限性,对于工程文件本身就比较大的,比如视频制作团队等,可以选择使用SVN来作为版本控制工具。

可是对于代码版本控制,对于这种不需要大量的大文件存储的,本身体量就不会非常大的文件,我们自然希望有一个可以更加方便更加完善的,能够进行版本控制、分支设计、代码合并的工具,这也是Git的目标,它是分布式的架构设计,相比于SVN提供了更好的可靠性,同时对于每次提交都会采用全量记录,一般不会选择删除代码,能够更好的保留代码的历史设计,同时它对于分支控制有一个更加完善的机制,所以Git成为了一个比较主流的版本控制工具

相应的,基于git也有很多的代码托管平台,比如说github、gitee、gitlab等等,就不需要个人开发者自行搭建相应的代码仓库服务器,只需要在平台上创建自己的仓库就能够进行使用

工作原理

重要概念

  1. 工作区

    工作区就是我们编写各类程序代码的地方,可以直接理解为工程目录下除了.git以及gitignore省略的文件之外的所有文件,这些文件在后续的提交都会被保存到仓库中

  2. 暂存区 正如名字所言,暂时存放改动的地方,工作区中对于代码的改动可以通过命令放入这个暂存区,此时还没有最终保存下来,更像是一种预选方案,但已经在.git文件中保存下来

  3. 本地仓库 这就是最终的提交,将暂存区中的数据成功的保存下来,成为一个新的commit版本

文件结构

git的整体结构比较简单清晰,通常一个工程文件在git init之后就会由git来管理版本,在工作目录下就能够看到.git文件,这就是最为核心的文件,所有的相关配置以及数据都存储在这里面,内部包含着HEAD、config、objects、refs等文件夹

config就是用于存放各类配置信息,但在git中配置分为三大类配置:global、system、local,优先级逐次降低,低优先级会覆盖高优先级的配置,而.git文件下的config存放的就是local配置,比如单独设置的remote源信息就会出现在这个地方,还有一些比较重要的,比如在第一次搭建git环境的时候就需要配置一个用户的用户名和邮箱,这里就会将配置配置到global,存到用户根目录下的.gitconfig中

objects是核心的数据存放目录,每当用户提交数据到暂存区或者到本地仓库都会生成相应的几个文件,这些文件就以随机生成的序列号作为文件名存在这个文件夹下

refs就记录了所有的指针信息,不同的分支不同的tag都会各自指向一个版本的commitid,而这个指向信息就会被存储在山这个文件夹下面

数据类型

在git中有那么四种类型的数据:

  1. Blob 存放的就是文件内容本身
  2. Tree 存放的是项目文件的一个树形结构
  3. Commit 存放的是每一次递交的一个版本映射以及相应信息,会存放每一次提交的文件的id
  4. Object 存放的是commitid,这在后续使用到tag的时候才会出现这个类型的数据,会记录打标签的人信息

从整体结构来说,git log命令能帮我们确认每一次的commitid,通过这个commitid我们就能够定位到tree文件的id,通过相应的tree文件我们就可以找到这个树结构下每个文件的Blobid,然后就能找到所有的数据

使用方法

在了解了上面的一些主要概念之后,就可以进行git的日常使用了

  1. git init

    这也是要使用git进行版本控制的必须有的一步,将当前的项目文件夹初始化成符合git标准的文件,也就是.git文件夹

  2. git remote

    这一步主要是为了拉取远端仓库的代码或者推送自己的代码到远端仓库,这个时候就需要指定远端仓库的地址,可以使用http或者ssh,但一般都会使用ssh,一方面比较安全,另一方面如果使用github,用http的方式经常会连接补上,ssh就会比较稳定,所以在使用ssh之前往往还需要在本地ssh-keygen命令生成一组公钥私钥,将公钥存到远端仓库上,这样就能够使用ssh连接了

  3. git add

    在写完当前版本的业务代码之后,就可以通过git add . 的方式快速的提交本次代码到暂存区,同时在.git的objects文件夹中就会生成相应的一个数据文件,这个文件是加密过的,可以使用git cat-file -p 文件名的方式查看文件,这个时候就会发现这里面存放的就是代码或者其他文件的数据内容

  4. git commit

    这一步命令就是将暂存区的文件存放到本地仓库,会在objects目录下生成两个文件,分别为tree文件和blob文件,同时在heads下面可以看到分支名,存放着本次提交的commitid

  5. git checkout

    这就是git中创建分支的方式,每次创建分支都会在refs下生成对应的分支的名字文件,同样存储的是commitid信息,并且提交之后可以选择和master分支进行一个merge,这里面如果没有冲突就会进行一个自动合并,如果有代码冲突,就会需要手动进行一个消除

  6. clone、fetch、pull、push 在完成了以上的各种操作之后往往就可以将代码从本地仓库发送到远端仓库了,我们就可以通过push来进行这一步推送,同时还有前面这三个命令,他们的主要功能大同小异就是为了拉取远端仓库代码到本地仓库,但是在具体的使用上还是会存在一些细微的差别,比如说在rebase上的区别,本文就不展开细说

总结

git工具的恰当使用可以很好的提高协作开发效率,以及对于分支归并、历史回溯等功能的使用就很好的提高了开发的容错性,并且众多的开发IDE都有提供对于git的支持,所以后续也需要进一步的区分好git的各项功能的使用