Git 与 Github

说到 Git,可能就会想到 Github。但是,读完这篇文章,你就会发现:

Git 与 Github 根本就是完全不同的两个东西

这里预先说一下答案,大家带着答案,边读边思考,岂不美哉?

Git 是一个分布式版本控制系统。
Github 只是一个源代码的托管平台。

分布式版本控制系统

概念

所谓版本控制系统,可以理解为管理软件项目的一个特殊数据库。这个数据库,可以用于并发控制、协作等等。

谈到分布式版本控制系统,就要说到集中式版本控制系统,简称 CVS。这一种布局需要一个中央服务器,用以管理项目文件的当前版本和历史版本。其他用户从该中央服务器中获取项目文件,并将其所作的修改,推送给中央服务器。换句话说,这些并行开发的项目“分枝”,以及各种命名(标志)的版本(其他用户的项目文件),都会被中央服务器集中管理。

相对的,不需要用到中央服务器,开发者都同时拥有当前项目文件、以及该项目的历史版本、分支、以及标签的本地版本库。每个开发者的修改都会被载入成一次新版本的提交,并更新本地版本库。之后,该开发者可以使用推送(Push)的方式,将其本地版本库(新版本的提交),用以更新其他开发者(可以不是所有开发者)的本地版本库。

当然,其他开发者也可以主动出击。将这位优秀的开发者的本地版本库,拉(pull)到自己的本地版本库中,从而实现其本身的本地版本库的同步。

具体如下:


理论上,分布式版本控制系统,可以不需要中央服务器。当然,在实践中,设置一个“中央服务器”可以让很多操作都方便很多。这个中央服务器,也叫服务器版本库。

一般的,服务器版本库有 4 种:1、项目版本库;2、共享版本库;3、工作流版本库;4、派生版本库。在后续的博文中,我们将详细讨论。

优点

  • 备份作用:类似与区块链,每一个开发者都有一份拥有完整历史版本的版本库。所以,服务器数据丢失,造成项目奔溃的可能性比较低。

版本库

以 Git 为例,分布式版本控制系统中,版本库相当于一个高效的数据库。

在 Git 中,每一个开发者在本地都会有:
1、工作区(保存项目文件、文件夹)
2、版本库(保存 Hash 值)

版本库中保存的是,所有历史版本的 Hash 值。即每一个版本,包括之前的所有版本,在版本库中都有相应的 Hash 值和标签与之对应。

Hash 值是怎么算出来的?

开发者对项目的每一次修改,就会产生每一个 Commit,并在本地版本库和工作区中创建一个新的版本。我们知道,一个版本有文件目录、文件夹,以及 Commit 的信息。 Commit 信息包括 Author、Date、Mesage(这个通常有用户自定义)。

然后,将目录、文件的内容、Commit 信息都翻译成十六进制,在用 SHA1 算法转换成 2160 种可能结果的 40 位的 Hash 值。如下图所示:

由于 SHA1 生成的 40 位哈希值的可能总数有 2160,因此通常不会重复。

采用 hash 数后,有如下优点:

  • 快速:通过存储一个 hash 表,可以提高数据库的查询速度。因此,也可以利用版本库所有内容的 hash 存储到内存中。并将 hash 值作为指针,来实现快速查询。
  • 不会出现冗余:假设有两个一模一样的文件,那么该文件产生的 Hash 数肯定也是一样的。于是,系统就会自动删除一个,以避免 Hash 重复。
  • 版本号:由于 Hash 几乎是独一无二的。因此,版本库的 hash 数也可以作为版本号。而且每一个版本库中的内容,都是其内容的 hash 构成的。因此,其存储空间其实不大。有了这个独一无二的版本号,就可以将历史版本做区分。
  • 同步高效:但文件内容改变后,势必会引起 hash 的变化。因此,如果一个 Commit 中,有些文件不变,那么其 hash 也不变。于是,只要传送那些,hash 发生变化的文件即可。
  • 数据完整性:得到 hash 后的一段时间里,我们可以通过再次计算文件中的内容,得出 hash 值与之前比较。通过检测 hash 是否改变,来判断数据是否被人恶意篡改。

分支

对于每一个开发者而言,可以在本地中创建多个版本库。选择其中一个版本库为活动分支(主分支)、其余分支为分支。

不同的版本库(不同开发者)实际上,也会产生不同的分支。例如有一个开发者,一条筋的开发到版本 A 的时候,开发者 2 发现了一个 Bug,并修正了这个 Bug。可是,开发者 1 已经开发到下一个、或者下下一个版本了。于是,这样就产生了两种不同的版本库。也即,产生了 2 个不同的分支。

分支当然是可以合并的。但是,请读者们思考。假若开发者 2 修改了文件 F 中的两条语句。但是,开发者 1 已经删除了两条语句中的一条,那么应该怎么整呢?

喜欢该教程的,就点赞吧…

Git 到底是个什么东西?相关推荐

  1. Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序(文末送书)

    Android 系统到底提供了哪些东西,供我们可以开发出优秀的应用程序. 作者:坚果 公众号:"大前端之旅" 华为云享专家,InfoQ签约作者,阿里云专家博主,51CTO博客首席体 ...

  2. Python到底是个什么东西

    Hello,我是 Alex 007,一个热爱计算机编程和硬件设计的小白,为啥是007呢?因为叫 Alex 的人太多了,再加上每天007的生活,Alex 007就诞生了. Python到底是个什么东西 ...

  3. 相机的 高清到底是一个什么东西

    高清到底是一个什么东西?可能很多人还只能依稀的知道1080P什么的.当你在广告中看到数字电视机时,总会说支持1080i/1080P这样标准,先不提现在市面上销售的电视机有几个能达到这样一个要求.我们来 ...

  4. “暗通道”到底是个什么东西

    对于图像去雾领域的研究者来说,何凯明博士的"暗通道先验(DCP)"可谓是奉若圭臬,接触这个概念一年了,但一直没有深挖,一直都是"拿来主义",看大家粗略地一概而过 ...

  5. Memory Compression这到底是个什么东西?

    Memory Compression这到底是个什么东西? Memory Compression这个进程,经过我的查询说是内存压缩功能,作用是压缩内存让内存占用更低,但是为什么这个进程疯狂占用我的内存, ...

  6. 优漫动游室内设计到底需要学习哪些东西?

      室内设计这个专业,很多校外培训学校都有这个课程,但是,课程内容都会不一样,有的只有软件,有的只有理论,让人不明觉厉.今天,我就来讲下,室内设计到底需要学习哪些东西.   软件类软件包括CAD,3D ...

  7. 框架到底是个什么东西?

    学程序入门阶段,我们听到最多的几个词中,框架就是其中之一,什么前端框架,后端框架,D4框架,Vue框架,ssm框架等等. 那么框架到底是个什么东西呢? 其实框架就是让写代码这个过程变得更简单的东西. ...

  8. 大数据面试:面试官要求我了解过Presto——Presto到底是个什么东西

    前言 大家好,我是程序员manor,我希望自己能成为国家复兴道路的铺路人,大数据领域的耕耘者,平凡但不甘于平庸的人. 事情是这样的 我在实习僧App上发现一家公司非常匹配我的需求~ 城市匹配 技能匹配 ...

  9. 2021最新最全!IntelliJ Idea如何使用使用Git!Git到底是什么!(值得一看)

    IntelliJ Idea如何使用使用Git!Git到底是什么! 前言 一.Git是什么 二.Git 工作区.暂存区和版本库.远程仓库 三.Git与SVN的区别 3.1 存储方式 3.2 使用方式 3 ...

最新文章

  1. 如何向亲戚们解释人工智能可以干啥?
  2. 构造函数,实例,原型,以及原型链
  3. 进阶学习(4.4) JVM GC Root 判定, 垃圾的判定
  4. 美国硅谷预测10年后的世界,再不懂你就落伍了
  5. 计算机在学前教育和美术绘画中的应用,幼儿园美术教学活动中信息技术的应用...
  6. c语言答辩题目,中学数学《线的认识》答辩题目与解析
  7. 交互系统的构建之(四)手掌与拳头检测加盟TLD
  8. 3D移动translate3d(CSS3)
  9. 在.NET中探测U盘的插入/拔出
  10. oe7 安装财务模块后,科目表没有导入成功
  11. 博途v14 加入C语言的方法,如何利用博途V14新建S7-1200项目?
  12. 初中计算机课堂游戏设计方案,初中信息技术教案设计
  13. win10禁止易升最有效的办法
  14. TWINCAT3导出html,【图解】TwinCAT 3学习之添加功能库
  15. 房产经纪人拿楼市新政炒作涨价
  16. 【100%通过率】华为OD机试真题 Python 实现【微服务的集成测试】【2023 Q1 | 100分】
  17. Excel转Json工具(支持GUI模式和命令行模式)
  18. 2021年将新推188部动画,爱优腾加上B站你选谁?
  19. 高职对计算机课程要求,高职计算机应用专业课程设置浅析
  20. javascript事件轮询(event loop)详解

热门文章

  1. 深度学习 数码管_创新研发基于深度学习的可见光智能检测技术
  2. 【项目经验】最新最全ElasticSearch操作详解
  3. weblogic wls-wsat组件远程命令执行(CVE-2017-3506)
  4. 此实现不是 Windows 平台 FIPS 验证的加密算法的一部分
  5. 《离散数学导学》精炼:第4,5章(集合论,布尔代数)
  6. PCI/CA体系下使用USBkey实现认证与加密(一)整体架构
  7. 一图解说JAVA的项目结构
  8. xmind8使用甘特图与导出甘特图PDF
  9. 基尔霍夫电压定律解析
  10. Boost在Windows XP运行的编译方法