GIT的前世今生

时间:2023-02-25 15:38:22

  在重点介绍GIT的一些操作之前,我们首先来说一说GIT的前世今生,了解整个版本控制的变迁能够让我们知道该如何去选择这些工具,另外通过这些技术的变迁也能够让我们对现在的技术有着更加深入的理解,在正式介绍之前之前我们首先搞清楚一些问题:1 什么是GIT?2 GIT和其他的版本控制工具比较有什么优势?带着这些问题我们来一步步去分析并进行总结。

  1 什么是GIT ?

  在了解这个问题之前我们需要了解一下整个软件版本控制的发展历程:什么是“版本控制”?我为什么要关心它呢? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。我们对保存着软件源代码的文件作版本控制,但实际上,你可以对任何类型的文件进行版本控制,关于文件的版本控制方面这里借用一个别人举出的一个例子,在大学毕业的时候我们都需要进行论文的提交,常用的我们会按照日期进行管理,然后我们的整个文档目录就会成为下面的样子,时间一长可能真的就搞不清楚了,最后就会造成灾难性的后果,所以从一开始就有人要着手解决这个问题啦,所以也有很多不同的版本控制系统问世,下面就简单介绍一下他的历史。

GIT的前世今生

  本地版本控制系统

  就像上面举出的这个例子一样许多人习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。 这么做唯一的好处就是简单,但是特别容易犯错。 有时候会混淆所在的工作目录,一不小心会写错文件或者覆盖意想外的文件。

为了解决这个问题,人们很久以前就开发了许多种本地版本控制系统,大多都是采用某种简单的数据库来记录文件的历次更新差异,下面通过一张图来表示这种本地版本控制系统。

GIT的前世今生

  这本本地化的版本系统能够在一个人进行文件协作时提供相当的帮助,但是有一个巨大的问题就是多人之间怎么协作?这个是个硬伤,所以有了下面的版本控制的历史演变。

  集中化的版本控制系统

  接下来人们又遇到一个问题,如何让在不同系统上的开发者协同工作? 于是,集中化的版本控制系统(Centralized Version Control Systems,简称 CVCS)应运而生。 这类系统,诸如 CVS、Subversion 以及 Perforce 等,都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。 多年以来,这已成为版本控制系统的标准做法,这里面最常用的应该就是SVN了,这在很长的一段时间内都是很流行并且还是非常常用的,当然现在用的也是非常多的,比如在一个局域网内部署这样一个服务器,然后多人协作开发确实也是一件非常好的解决办法,下面也通过一张图片来表明这种协作的关系图。

GIT的前世今生

  

  这种做法带来了许多好处,特别是相较于老式的本地 VCS 来说。 现在,每个人都可以在一定程度上看到项目中的其他人正在做些什么。 而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。但是事分两面,有好有坏。 这么做最显而易见的缺点是*服务器的单点故障。 如果宕机一小时,那么在这一小时内,谁都无法提交更新,也就无法协同工作。 如果中心数据库所在的磁盘发生损坏,又没有做恰当备份,毫无疑问你将丢失所有数据——包括项目的整个变更历史,只剩下人们在各自机器上保留的单独快照。 本地版本控制系统也存在类似问题,只要整个项目的历史记录被保存在单一位置,就有丢失所有历史更新记录的风险。鉴于以上各种弊端,后面的分布式版本控制系统就应运而生了,这个版本最开始出现是在Linus Torvalds
为了解决Linux系统的源代码管理而开发的,这里有一段当时的初衷的资料:2005 年,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了 Linux 内核社区免费使用 BitKeeper 的权力。Linus 不想倒退回到没有高效版本管理的时代;而除了 BitKeeper 之外,没有其他软件可以做到更好的远程协同;并且 Linus 还很在意代码的完整性和整个管理流程。为此,自己动手研发一个软件成为了当时唯一的解决方案,这个解决方案就是Git。  

  分布式版本控制系统

  于是分布式版本控制系统(Distributed Version Control System,简称 DVCS)面世了。 在这类系统中,像 Git、Mercurial、Bazaar 以及 Darcs 等,客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。 这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。 因为每一次的克隆操作,实际上都是一次对代码仓库的完整备份,下面就来一张图片来介绍一下。

GIT的前世今生

  这样做的好处当然是非常多的,许多这类系统都可以指定和若干不同的远端代码仓库进行交互。籍此,你就可以在同一个项目中,分别和不同工作小组的人相互协作。 你可以根据需要设定不同的协作流程,比如层次模型式的工作流,而这在以前的集中式系统中是无法实现的,当然这样做好处就是非常多的,但是就有可能造成了学习难度的增加,但好在现在的互联网这么发达,很多问题都能够找到最终的解决方案。

  这种复杂度的提升体现在哪些方面呢?下面通过一组图片来介绍两者之间的一些区别,通过这张结构图你就能很好的去理解了。

  SVN结构:

GIT的前世今生

  GIT结构:

GIT的前世今生

  通过这一组对比,你应该对整个复杂性方面有个大概的了解了吧,当然后面我也会通过相关章节来分别介绍这些常用的命令,从而让GIT的使用不再是那么神秘了,下面的一节我们重点将要来讲述GIT的安装部署及如何在GitHub上面建立远程仓库,请关注。

  

GIT的前世今生的更多相关文章

  1. 小乌龟git

    一.概念 分布式版本控制系统.诞生于Linux社区,有兴趣可以去了解下git的前世今生. 与集中式版本控制有明显区别.集中式:集中管理的服务器,保存所有的修订版本,协同工作的人通过客户端连接服务器,取 ...

  2. Android群英传神兵利器读书笔记——第二章:版本控制神器——Git

    本人一直是徐医生的真爱粉,由于参加比赛耽误了8天,导致更新得有点慢,大家见谅 2.1 Git的前世今生 Git是什么 Git安装与配置 2.2 创建Git仓库 Git init Git clone 2 ...

  3. 将本地的代码推送到公网的github账号去

    将本地的代码推送到公网的github账号去 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近工作上需要用到github账号,拜读了一位叫廖雪峰的大神的文档,把git的前世今生说的 ...

  4. Git分支的前世今生

    摘自Jack__CJ  CSDN博客,写得很好,保存一下. 导读 几乎所有的版本控制系统都以某种形式支持分支. 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线. 在很多版本控制系 ...

  5. git 参考手册-简明指南

    很久没发文了,来头条以后更忙了,也没精力去分享一些有营养的内容了.这次分享的 git 的方方面面,基本来自于我的笔记.git 这东西算是为数不多每天都要用的东西了,但是我觉得也不至于从头至尾去了解他的 ...

  6. 19. 一文搞懂 Go Modules 前世今生及入门使用

    Hi,大家好. 我是明哥,在自己学习 Golang 的这段时间里,我写了详细的学习笔记放在我的个人微信公众号 <Go编程时光>,对于 Go 语言,我也算是个初学者,因此写的东西应该会比较适 ...

  7. Git 子模块 - submodule

    有种情况我们经常会遇到:某个工作中的项目需要包含并使用另一个项目. 也许是第三方库,或者你 独立开发的,用于多个父项目的库. 现在问题来了:你想要把它们当做两个独立的项目,同时又想在 一个项目中使用另 ...

  8. Git 在团队中的最佳实践--如何正确使用Git Flow

    我们已经从SVN 切换到Git很多年了,现在几乎所有的项目都在使用Github管理, 本篇文章讲一下为什么使用Git, 以及如何在团队中正确使用. Git的优点 Git的优点很多,但是这里只列出我认为 ...

  9. 【调侃】IOC前世今生

    前些天,参与了公司内部小组的一次技术交流,主要是针对<IOC与AOP>,本着学而时习之的态度及积极分享的精神,我就结合一个小故事来初浅地剖析一下我眼中的“IOC前世今生”,以方便初学者能更 ...

随机推荐

  1. Python进阶【第二篇】多线程、消息队列queue

    1.Python多线程.多进程 目的提高并发 1.一个应用程序,可以有多进程和多线程 2.默认:单进程,单线程 3.单进程,多线程 IO操作,不占用CPU python的多线程:IO操作,多线程提供并 ...

  2. SQL SERVER:开窗函数 SUM&lpar;&rpar; OVER&lpar;&rpar; 数据统计中一例使用

    由于前一段时间胃痛,导致博客园博客都停更了一个月左右.近几天,胃病终于稍微有所好转,决定重新写博文. 前几天,有个朋友刚好问到本人有关 SQL 语句,大致是原表有两列,分别为月份.月份销售额,而需要一 ...

  3. C&num;连接SQLite数据库方法

    --结合Enterprise Library连接,操作SQLite 企业库是我们常用的框架之一,可以从http://entlib.codeplex.com/下载Enterprise Library 5 ...

  4. debian下samba配置

    debian下samba配置  http://blog.chinaunix.net/uid-2282111-id-2113216.html 服务器端配置过程:1. apt-get install sa ...

  5. NOIP 2011 观光公交

    题目描述 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第 0 分钟出现在 1号景点,随后依次前往 2 ...

  6. C&plus;&plus;链表模板类

    思想和上篇文章差不多,只是换了层包装. 直接上代码: // linklist.h #include <iostream> #include <cstdio> using nam ...

  7. BZOJ&period;3227&period;&lbrack;SDOI2008&rsqb;红黑树tree&lpar;树形DP 思路&rpar;

    BZOJ orz MilkyWay天天做sxt! 首先可以树形DP:\(f[i][j][0/1]\)表示\(i\)个点的子树中,黑高度为\(j\),根节点为红/黑节点的最小红节点数(最大同理). 转移 ...

  8. C&plus;&plus;中的仿函数

    仿函数:实质就是重载了小括号(),通过类,定义一个对象,对象可以被实例化,具有内存可以存储数据,把需要比较的数据事先给到类对象的成员,这样在比较两个值的时候,可以只传入需要被比较的值即可.因为比较的值 ...

  9. Bubble&lpar;冒泡排序&rpar;————Java

    用Java进行冒泡排序的代码,利用一个flag进行优化算法: import java.util.Scanner; public class Bubble_Sort { private static i ...

  10. 转 Hibernate中cascade和inverse的作用

    Inverse和cascade是Hibernate映射中最难掌握的两个属性.两者都在对象的关联操作中发挥作用.1.明确inverse和cascade的作用inverse 决定是否把对对象中集合的改动反 ...