GIT是如今最流行的版本控制系统。曾经系统总结过一次关于GIT的使用,抽时间整理成文。

基础概念

GIT是一种版本控制软件,那就首先了解一下什么是 “版本控制”?

比较官方的解释是,版本控制系统是一种记录一个或若干个内容变化,以便将来查询特定版本修订情况的系统。

简言之,你的修改只要提到到版本控制系统,基本都可以找回,版本控制系统就像一台时光机器,可以让你回到任何一个时间点。

了解了版本控制系统的功能,我们知道就算你把代码改的一塌糊涂,照样可以恢复到我们过去的任何一个时间点,工作量却微乎其微。是不是很amazing。

总结一下版本控制系统有哪些优点:

  • 记录文件所有历史变化。这是版本控制系统的基本能力;
  • 随时恢复到任意时间点。历史记录功能使我们不怕改错代码了;
  • 支持多功能并行开发。通常版本控制系统都支持分支,保证了并行开发的可行;
  • 多人协作并行开发。对于多人协作项目,支持多人协作开发的版本管理将事半功倍;

除了上面介绍的几个比较常见的优点,版本控制系统的好处还有很多,就不一一列举了,可通过实践自己逐渐体悟总结。下面基于GIT做更多介绍。

常见类别

版本控制系统常见类别有三种

  • 本地版本控制系统、
  • 集中式版本控制系统、
  • 分布式版本控制系统;

本地版本控制系统

代表有RCS(Revision Control System),Linux下面的可用来作为配置文件管理的版本控制工具,本人尝试了一下,工作使用不多;

关于其优缺点,简述如下:

优点

  • 简单,很多系统中都有内置;
  • 适合管理文本,如系统配置;

缺点

  • 管理少量文件,不支持项目的管理;
  • 支持的文件类型单一;
  • 不支持远程,网络传输;

集中式版本控制系统

代表如CVS,SVN(Subversion),SVN是曾经最流行的版本管理系统,很多人都有用过,因而对于集中式版本控制系统很多人都很了解它。

优点

  • 适合多人团队协作开发;
  • 代码集中化管理;

缺点

  • 单点故障;
  • 必须联网,无法单机工作;

优点就不多说了,大家可能对缺点更是记忆深刻。 单点故障,集中式管理的缺点,代码集中在一台机器上,这个问题其实可以通过备份集群解决;

必须联网工作,这个缺点我是深入痛觉,一旦公司网络出现问题,几个小时甚至一天无法工作的经历都有。由于这些缺点,便有了分布版本控制系统。

分布式版本控制系统

分布式版本控制系统的代表就是今天要介绍的 GIT 了。想知道 GIT 有多流行吗?看看 Github 就知道了,现在很多公司都已经把自己的代码库迁移到了 GIT。本人由于各种原因,近两年已经到了第三家公司,其中每家都听过一次 GIT 的分享。可见 Git 在如今的流行程度,也说明了分布式版本控制系统是如今的趋势。

关于分布式版本控制系统,这里只说优点:

  • 适合多人团队协作开发;
  • 代码集中化管理;
  • 可以离线工作;
  • 每个计算机都是一个完整仓库;

1、2两点 svn 也可以做到,说一下3、4点。

可以离线工作,分布式版本管理系统每个计算机都有一个完整的仓库,可本地提交,可以做到离线工作。没有了 svn 令人抓狂的断网无法工作问题;

每个计算机都是一个完整的仓库,也就没有了SVN的单点故障。

GIT与SVN的比较

GIT的作者Linus一直比较痛恨集中方式版本控制系统。虽然有很多已知免费的集中式版本控制系统,但是在2002之前提交Linux源码的方式都是通过diff提交给Linus的,然后进行手工合并。下面让我们来以GIT与SVN作为代表,来看看为什么Linus痛恨集中式版本管理系统,而喜欢分布式版本管理系统。下面具体比较一下它们的区别:

GIT是分布式的,SVN为集中式的,这是常识,两者最重要的区别,也是后面所有区别的基石;

GIT随处都是版本库,SVN只有一个中央版本库,因为GIT是分布式的所以能做到到处都是版本库,而SVN是集中式的,所以只有一个中央仓库。因而GIT能够做到无需网络提交,到处到时版本库,压根不用担心提交速度问题,不用时刻依赖与网络工作,不用担心单点故障。当工作完成之后直接推送远程即可实现工作协作;

GIT没有全局版本号,SVN有全局版本号,GIT版本库到处都是,之间没有实时共享数据,所以无法确保版本号的唯一性,无法使用全局版本号,分布在各个机器上的版本库版本号使用40位的HASH值取代。重复的情况是存在的,从数学的角度考虑,可能性是2的63次方分之一,基本可忽略。而对于SVN,唯一版本,所以能够做到使用全局的版本号,版本号采用自增的方式;

GIT把内容按元数据存储,SVN按文件存储,GIT存储的不是实际的文件,而是指向性数据。SVN保存的是文件数据。当GIT切换版本的时候,实际上切换的是元数据,而且本地操作,快捷有效;

GIT记录文件快照,SVN记录文件差异,GIT的元数据,即指向性数据指向的是实际的文件快照,这也是GIT能够快速切换版本的一个原因。SVN保存的文件数据是各个版本之间的文件差异,所以切换版本的时候需要逐级的差异计算,速度比较慢,而且还需网络传输。当工程较大时,速度与GIT相比差异会相当的大。

GIT的内容完整性高,SVN完整性低,因为GIT的数据记录都有HASH值校验,所以内容完整性较高。而SVN则没有此功能,内容完整性低。;

以上就是本人总结的GIT与SVN的部分差异。

GIT架构

GIT的架构,可以分为几个部分:

  • 本地工作区(working directory)
  • 暂存区(stage area, 又称为索引区, index)、
  • 本地仓库(local repository)、
  • 远程仓库副本
  • 远程仓库(remote repository)。

如下图:

上图展示了git的整体架构,以及和各个部分相关的主要命令。先看了解说明下其中涉及的各个部分。

工作区(working directory)

工作区,简言之就是你工作的区域。对于git而言,就是的本地工作目录。工作区的内容会包含提交到暂存区和版本库(当前提交点)的内容,同时也包含自己的修改内容。

暂存区(stage area, 又称为索引区index)

暂存区是git中一个非常重要的概念。是我们把修改提交版本库前的一个过渡阶段。查看GIT自带帮助手册的时候,通常以index来表示暂存区。在工作目录下有一个.git的目录,里面有个index文件,存储着关于暂存区的内容。git add命令将工作区内容添加到暂存区。

本地仓库(local repository)

版本控制系统的仓库,存在于本地。当执行git commit命令后,会将暂存区内容提交到仓库之中。在工作区下面有.git的目录,这个目录下的内容不属于工作区,里面便是仓库的数据信息,暂存区相关内容也在其中。

远程版本库(remote repository)

远程版本库与本地仓库概念基本一致,不同之处在于一个存在远程,可用于远程协作,一个却是存在于本地。通过push/pull可实现本地与远程的交互;

远程仓库副本

可以理解为存在于本地的远程仓库缓存。如需更新,可通过git fetch/pull命令获取远程仓库内容。使用fech获取时,并未合并到本地仓库,此时可使用git merge实现远程仓库副本与本地仓库的合并。

git文件一览

看看.git这个目录的下文件结构,如下图:

简要说明一下各个文件中所存放的内容信息:

HEAD

当前所在位置,其实就是工作区的在版本库中的那个提交点,最终会指向一个40位的HASH值;

config

当前版本库的专有配置文件,如使用命令git config user.name poloxue便会记录在此文件;

description

被gitweb (Github的原型)用来显示对repo的描述。

hooks

git有可自动运行在 git 任有意义阶段的脚本hooks, 如commit/release/pull/push等状态之前或者之后。个人思考的一个用处,如pre-push可以用来强制进行代码检查。

index

存放暂存区(stage area)的相关信息;

info/exclue

可以做到和.gitignore相同的事情,用于排除不要包含进版本库的文件。区别就是,此文件不会被共享。

refs/heads

目录下有关于本地仓库的所有分支;

refs/remote

目录下有关于远程仓库的所有分支;

object

目录下存放的就是实际的数据文件,关于其中的存放方式暂时还不了解,有兴趣可以研究一下;

本节从版本控制引出分布式版本控制,比较分布式版本控制系统与其他版本控制系统的区别,从而引入GIT。与SVN的比较明显可看出GIT的优秀之处。对GIT的架构也进行整体简单介绍。内容比较理论,期望在理清自己思路的同时,不会误导他人。

好了,就说这么多!文中如有错误,请帮忙指正!谢谢!

参考附录

  • 廖雪峰的 Git 教程

  • Pro Git

  • Git 本地仓库内部结构

  • .git 目录结构

  • 深入理解git,从研究git目录开始

转载于:https://juejin.im/post/5cee54f0f265da1bbc6fb7eb

GIT 之概述与架构相关推荐

  1. [MAUI 项目实战] 音乐播放器(一):概述与架构

    系列文章将分步解读音乐播放器核心业务及代码: [MAUI 项目实战] 音乐播放器(一):概述与架构 [MAUI 项目实战] 音乐播放器(二):播放内核 [MAUI 项目实战] 音乐播放器(三):界面交 ...

  2. Hadoop的简单概述以及架构

    Hadoop的简单概述以及架构 1.hadoop概述:hadoop是一个适合海量数据分布式存储和分布式计算的平台. 2.hadoop是一个统称,hadoop主要包含三大组件: (1)hdfs:是一个分 ...

  3. [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构

    这是一篇系列博文.请关注我,学习更多.NET MAUI开发知识! [MAUI 项目实战] 手势控制音乐播放器(一): 概述与架构 [MAUI 项目实战] 手势控制音乐播放器(二): 手势交互 [MAU ...

  4. 只懂 Git 就能成为架构专家?这得从代码的物理分析说起

    作者 | phodal   责编 | 欧阳姝黎 出品 | CSDN(ID:CSDNnews) 物理分析这一词,来源于我同事 @NoaLand 所推荐的<大规模 C++ 程序设计>一书中所介 ...

  5. 互联网架构概述 互联网架构演变过程

    互联网架构概述 文章目录 互联网架构概述 一.互联网架构特点 二.衡量网站性能的指标 三.互联网架构目标 四.集群和分布式 五.互联网架构演变 1. 单体架构 2. 垂直架构 3. 分布式架构 4. ...

  6. VTK 学习----VTK基础-VTK概述和架构概述

    3.1 VTK概述 什么是VTK?VTK最初被设想为科学数据可视化系统.该领域之外的许多人将可视化视为特定类型的几何渲染:检查虚拟对象并与它们交互.虽然这确实是可视化的一部分,但一般而言,数据可视化包 ...

  7. Docker 私有仓库部署和管理 | Harbor 概述 - 核心组件 - 架构拓扑 | Harbor 构建 Docker 私有仓库实战(理论+实操,超详细!)

    文章目录 一.Docker Harbor 概述 1.Harbor 简介 2.Harbor 的优势 二.Harbor 的核心组件 1.Proxy 2.Registry 3.Core services 4 ...

  8. [架构之路-109]-《软考-系统架构设计师》-软件架构设计-2-软件架构概述:架构风格

    引言 建筑风格指建筑设计中在内容和外貌方面所反映的特征,主要在于建筑的平面布局.形态构成.艺术处理和手法运用等方面所显示的独创和完美的意境.建筑风格因受时代的政治.社会.经济.建筑材料和建筑技术等的制 ...

  9. 架构概述之架构演化、模式与核心要素

    如何打造一个高可用.高性能.易扩展.可伸缩且安全的应用系统?相信这是困扰着无数开发者的难题,在这里我们以一个网站为例,来讨论一下如何做好大型应用系统的架构设计. 架构演化发展历程 大型网站的技术挑战主 ...

最新文章

  1. 【英文文本分类实战】之四——词典提取与词向量提取
  2. 配置中心框架IConfCenter
  3. linux怎么运行cli,linux脚本 直接用cli模式运行脚本
  4. ArcGIS.Server.9.3和ArcGIS API for JavaScript实现Identify功能(六)
  5. ios打包报错:User interaction is not allowed
  6. MySQL之长连接、短连接、连接池(转载:http://www.ywnds.com/?p=9801)
  7. 华为与五粮液签署战略合作协议
  8. java 天上掉东西游戏的源代码_【小游戏】前两天的小游戏终于调试成功了。。。。直接源代码...
  9. matlab2010b数值分析,matlab2010b教程
  10. java网上销售外文文献_基于java网上购物论文英文的参考文献欣赏
  11. 交通灯设计(基于Multisim仿真)
  12. 泰山OFFICE技术讲座:微软雅黑字体故意设置的坑,粗体错误
  13. 数据库(mysql)基本概念
  14. 肠道微生物:治疗功能性消化不良的新途径
  15. 用好图片,让PPT富有冲击力
  16. 数据分析(1)——统计学中的各种分布
  17. 智能电视应用与移动应用开发的比较
  18. mysql商品多个属性设计_商品多规格多属性模型设计思路
  19. BeautifulSoup 删除标签而不删除内容(unwrap())
  20. 亚信科技、清华AIR、英特尔成功举办WAIC智能算网与绿色计算论坛

热门文章

  1. python集合补集、差集、并集_python set集合运算(交集,并集,差集,对称差集)...
  2. 视觉SLAM——英特尔D435i相机内参矩阵标定
  3. ps3存档是php文件,PS3存档修改图文详细全教程
  4. staticextension 上提供值时引发了异常_牛!一张图整理出了 Python 所有内置异常
  5. python读取excel日期和时间数据_python 在excel文件中写入date日期数据,以及读取excel日期数据,如何在python中正确显示date日期。...
  6. 请求失败或服务器为及时响应,SQLServer(MSSQLSERVER)请求失败或服务未及时响应,有关详细信息,请参见事件日志或其他的适用的错误日志。...
  7. C++scoket编程(三):3.8 TCPserver开启多线程并发
  8. python自助电影售票机_Spring Cloud版——电影售票系统六使用 Spring Cloud Config 统一管理微服务配置...
  9. 如何对聚类结果进行分析_产品经理如何进行数据分析?
  10. 云服务器 文件服务,云服务 做文件服务器