Git 到底是个什么东西?

Posted zhuo木鸟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git 到底是个什么东西?相关的知识,希望对你有一定的参考价值。

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 到底是个什么东西?的主要内容,如果未能解决你的问题,请参考以下文章

git是个什么鬼?

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

Git与GitHub到底有什么联系?

git 学习之分支

析说美国想要制裁中国的SWIFT系统到底是个什么东西

Git到底是什么?