一、什么是Git

答:Git是一个分布式版本控制软件。另外提一句,它的开发者就是大名鼎鼎的Linux之父Linus。

版本控制,顾名思义,是一种在开发的过程中用于管理我们对文件、目录或工程等内容的修改历史,方便查看更改历史记录,备份以便恢复以前的版本的技术。(“后悔药”)

分布式,是一种版本控制的方式,有一个中心的服务器控制最新版本代码,每个开发者自己还有个本地仓库,在开发过程中先将代码提交到本地仓库再推送到中心服务器上。

也就是说,Git可以帮助我们完成这几件事:

回到过去

改变历史

古今对比

并行开发

谁动了我的代码

除了Git外,常见的版本控制软件还有SVN等

二、Git基本原理

Git的基本操作有很多,如果不理解其中的原理只是靠死记硬背,那肯定会事倍功半,所以,我建议第一步我们来学习下它的基本原理(亲身体会啊/哭,以前学过好几次Git,但过一段一时间不用就忘得差不多了,回头想想原来学的总是一知半解)。

我们先来想一个问题:Git为什么能知道我们以前的代码,为什么能“回到过去”,答案就是因为Git把我们每一次修改提交的代码以及状态都保存了下来,而展示给我们的只有当前一个版本。看下面这张图:



每次提交或保存当前项目状态,Git都会生成一个当前所有文件状态的快照,并存储一个对该快照的引用;而且文件没有发生变化时,Git不会重复保存快照,而只是链接到之前的标识文件。

说到这,可能还点不明白,别急,我们接下来看看快照到底存储了哪些东西。

快照存储不是一个个代码源文件,而是四种对象,几乎所有的Git操作都是在这四种对象上完成的,这四种对象是:

  • “blob”:一个“blob”通常用来存储文件的内容。一个“blob”对象就是一块二进制数据,它没有指向任何东西或有任何其它属性,甚至没有文件名。因为“blob”对象内容全部都是数据,所以如若两个文件在一个目录树或是一个版本仓库中有同样的数据内容,那么它们将会共享同一个“blob”对象。“blob”对象和其所对应的文件所在路径、文件名是否改被更改都完全没有关系。
  • “tree”:像一个目录,管理一些“tree”对象或是“blob”对象。它有一串指向“blob”对象或是其它“tree”对象的指针,一般用来表示内容之间的目录层次关系(就像文件和子目录)。
  • “commit”:“commit”对象指向一个“tree对象”,并且带有相关的描述信息,标记项目某一个特定时间点的状态。它包括一些关于时间点的元数据,如时间戳、最近一次提交的作者、指向上次提交的指针等等。
  • “tag”:一个“tag”对象包括一个对象名(SHA1签名)、对象类型、标签名、标签创建人的名字(“tagger”), 还有一条可能包含有签名(signature)的消息。

这些对象的关系可以用下图来理解:



所有的对象通过commit对象联系起来,每一次commit对象中又都会指向上一次提交后的commit对象,所以如果我们什么时候想回退版本,只需要找到相应的commit对象即可。而我们所谓的HEAD对象其实就指向最近一个提交的commit对象,也就是最后一个commit对象。

例如我们有一个项目,如果我们把它提交(commit)到一个Git仓库中, 在Git中“blob”、“commit”和“tree”对象的关系看起来会如下图:



可以看到: 每个目录都创建了“tree”对象, 每个文件都创建了一个对应的“blob”对象。最后有一个“commit”对象来指向根“tree”对象,这样我们就可以追踪项目每一项提交内容。

另外,这些对象的命名也很有讲究:在Git里随处可见一种“40个字符”的字符串(例如 6ff87c4664981e4397625791c8ea3bbb5f2279a3)。由于Git中每一个“对象名”都是对“对象”内容做SHA1(SHA1是一种密码学的哈希算法)哈希计算得来的,所以对于内容不同的对象,会有不同的SHA1哈希值。这样就意味着两个不同内容的对象不可能有相同的“对象名”。

这样,一次快照就是将有关的对象,即一组组由对象名和对象内容组成的的键值对存储下来。所以Git才会有那么好的“记忆力”。

三、Git用户交互

第二部分已经介绍了Git的基本原理,但只是涉及到Git自己内部存储,没说用户该怎么操作,所以为了能正常输入和输出,与用户交互,Git做了这样几件事。

说到这,我又想提一个常见的词API,API就是Application Programming Interface(应用程序接口),《JavascriptDOM编程艺术》书里提到“简单地说,API就是一组已经得到有关各方共同认可的基本约定”,说实在地我觉得这说的一点也不简单,书里这样说可能是想定义得更加广泛,但我的理解是从小地说API就像一个封装完成的函数,你给它一个输入,它给你一个输出,从大地说API就是一个程序,也是输入与输出,区别就在于规模的不同,结合到本文的内容,Git也像是一个API,输入命令,操作数据。好了我不说了,感觉自己着迷了,看什么都像API 。\笑哭

回到正文,Git为了与交互,做了什么事呢?

答案在下面的图里:

在Git,文件可能有三种状态:已提交(committed),已修改(modified),暂存(staged):

  • 已提交(commited),说明数据已经存储在本地数据库;
  • 已修改(modified),说明数据被修改,但是尚未存储到本地数据库;
  • 暂存(staged),说明已标记将一个被修改的文件(当前版本)添加到待提交的快照中。

这三种状态分别对应Git项目的三大区块:Git目录,工作目录,暂存区。

  • Git 目录(repository),即Git存储项目元数据和对象数据库的地方,也就是我们克隆(clone)某项目仓库时拷贝下的内容所在地;
  • 工作目录(working directory),即从项目某版本中检出的当前所处分支,也就是从Git目录数据库中拉取的文件在本地磁盘保存所在地;
  • 暂存区(staging area),即一个文件,通常包含在Git目录中,存储下一次需提交的内容,有时,它指向我们所说的“index”索引。

所以我们的实际操作流程是:

  • 从Git目录,检出分支到工作目录
  • 在工作目录修改文件
  • 暂存文件,将其添加到待提交快照
  • 提交,将快照持久化提交到Git目录

这些结合起来,就为我们进行代码版本控制提供了充足的底层支撑,这次就先写到这里,下一篇将详细介绍Git的使用与指令。

开发工具之Git(一)的更多相关文章

  1. IDEA开发工具使用 git 创建项目、拉取分支、合并分支

    转载自:https://blog.csdn.net/qq_39470733/article/details/80366435 工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有 ...

  2. 开发工具之Git(二)

    目录 四.Git安装与配置 (一)安装 (二)配置 (三)创建仓库 五.Git基本命令 六.Git分支 上一篇讲了Git的基本原理,建议没看过的同学先看看,然后这次我们来讲Git的具体操作和指令. 四 ...

  3. 开发工具之GIT

    GIT WORKFLOW this readme created on 2019.07.28 by Suarez7988 这是一遍介绍git版本控制流程的中文说明,必须通篇阅读一下 https://g ...

  4. Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源,BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 各种后台管理系统

    Java,面试题,简历,Linux,大数据,常用开发工具类,API文档,电子书,各种思维导图资源,百度网盘资源BBS论坛系统 ERP管理系统 OA办公自动化管理系统 车辆管理系统 家庭理财系统 各种后 ...

  5. 如何使用IDEA开发工具中右键中的Git图形化工具

    首先,你的项目一定是git服务器上面down下来的,下面来演示如何使用IntelliJ IDEA 开发中在鼠标右键中提供的一个非常方便的图形化Git管理工具: 这里使用的IDEA开发工具的版本是 In ...

  6. 开发工具--浅谈Git

    工具|浅谈Git Git这个工具,是我一直想写文章,终于我实现了我的想法.在我开始写之前,发表一下自己的看法,git只是一个工具,既然已经认定是一个工具,那么一定具备工具这类的共同特征,请用面向对象的 ...

  7. Chrome 开发工具之Console

    前段时间看git的相关,记的笔记也大致写到了博客上,还有些因为运用不熟,或者还有一些疑惑点,暂时也不做过多纠缠,之后在实践中多运用得出结论再整理分享吧. 工欲善其事,必先利其器.要想做好前端的工作,也 ...

  8. Android 常用开发工具以及Mac常用软件

    Android 常用的开发工具记录.其中包括AndroidStudio(IDEA)插件.Mac 上好用的软件以及国内知名Android开发者博客等. Android Studio 插件 codota ...

  9. 超全的web开发工具和资源

    首页 新闻 产品 地图 动态 城市 帮助 论坛 关于 登录 注册 · 不忘初心,继续前进,环境云V2接口正式上线 · 环境云测点地图全新改版 · 祝福各位环境云用户中秋快乐!   平台信息 培训互动 ...

随机推荐

  1. HCIA——应用层常用协议

    DNS协议 1.什么是DNS协议呢? DNS协议简单来说就是为IP取一个别名的系统(叫域名如www.baidu.com),最终目的是便于我们记忆. 一个域名可能有多个IP,同样一个IP可能也会有多个域 ...

  2. k8s-获取kuboardtoken

    master节点执行命令 echo $(kubectl -n kube-system get secret $(kubectl -n kube-system get secret | grep kub ...

  3. is, ==, id 用法、代码块和缓存机制

    id(): 获取对象的内存地址:print(id(i)) == : 比较两边的值是否相同 is : 判断内存地址是否相同 id相同,值一定相同 值相同,id不一定相同 代码块: Python是由代码块 ...

  4. 远程Jenkins新增Mac电脑节点

    一,前言 上一篇博客Jenkins集成appium自动化测试(Windows篇)介绍了怎么使用远程Jenkins新建节点连接本地Windows电脑进行Appium自动化测试集成. 但是在做ios Ap ...

  5. Anderson《空气动力学基础》5th读书笔记 第3记——流动类型

    一.连续介质与自由分子流动   分子之间相互碰撞的平均距离定义为平均自由程 .如果平均自由程的数量级远小于飞行器的尺寸时,此时,分子对物体的碰撞如此频繁以至于物体无法分辨出单个的分子碰撞,这时,对物体 ...

  6. 【线上排查实战】AOP切面执行顺序你真的了解吗

    前言 忙,是我这个月的主旋律,也是我频繁鸽文章的接口----蛮三刀把刀 公司这两个月启动了全新的项目,项目排期满满当当,不过该学习还是要学习.这不,给公司搭项目的时候,踩到了一个Spring AOP的 ...

  7. Shell脚本学习指南笔记(一)

    脚本语言通常是解释型的,这类程序的运行.是由解释器读入程序代码,并将其转换成内部的形式, 再执行,解释器本身是一般的编译型程序. 第一行的开头处使用#!这两个字符,当内核扫描到改行的其余部分,看是否存 ...

  8. 三种方式获取SSMS连接密码

    内网渗透是有的时候会遇到对方SSMS没断开连接正连着别的机器的mssql此时有两种方法可以获取sa密码 当密码强度较弱时可以使用第一只方式,第一种方式解不开的情况下可以使用后面二种方式 1.直接查询s ...

  9. skywalking8.1.0(一) 安装与部署

    skywalking部署 背景介绍 目前公司后端服务全部为微服务并运行在kubernetes集群上,而大量的微服务的背后拥有很复杂的调用关系,纵使你是公司的资深开发也很难理清每一个后端服务之间的依赖关 ...

  10. Hadoop框架:HDFS高可用环境配置

    本文源码:GitHub·点这里 || GitEE·点这里 一.HDFS高可用 1.基础描述 在单点或者少数节点故障的情况下,集群还可以正常的提供服务,HDFS高可用机制可以通过配置Active/Sta ...