Git 的介绍

前言

本教程是参考 Pro Git (中文版),仅记录自己学习过程。

1.1 版本控制

  • 定义
    版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
  • 一般情况,我们仅对保存着软件源代码的文本文件作版本控制管理,但实际上,你可以对任何类型的文件进行版本控制。
  • 简要介绍
    采用版本控制系统(VCS)是个明智的选择,有了它你就可以将某个文件回溯到之前的状态,甚至将整个项目都回退到过去某个时间点的状态。你可以比较文件的变化细节,查出最后是谁修改了哪个地方,从而找出导致怪异问题出现的原因,又是谁在何时报告了某个功能缺陷等等。

1.1.1.本地版本控制系统

人们习惯用复制整个项目目录的方式来保存不同的版本,或许还会改名加上备份时间以示区别。这么做唯一的好处就是简单。不过坏处也不少:有时候会混淆所在的工作目录,一旦弄错文件丢了数据就没法撤销恢复。
在这里插入图片描述

工作原理基本上就是保存并管理文件补丁(patch)。文件补丁是一种特定格式的文本文件,记录着对应文件修订前后的内容变化。所以,根据每次修订后的补丁,rcs 可以通过不断打补丁,计算出各个版本的文件内容。

1.1.2. 集中化的版本控制系统

集中化的版本控制系统( Centralized Version Control Systems,简称 CVCS ),有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新。
在这里插入图片描述
每个人都可以在一定程度上看到项目中的其他人正在做些什么。而管理员也可以轻松掌控每个开发者的权限,并且管理一个 CVCS 要远比在各个客户端上维护本地数据库来得轻松容易。
事分两面,有好有坏。这么做最显而易见的缺点是中央服务器的单点故障。

1.1.3. 分布式版本控制系统

分布式版本控制系统( Distributed Version Control System,简称 DVCS ),客户端并不只提取最新版本的文件快照,而是把代码仓库完整地镜像下来。这么一来,任何一处协同工作用的服务器发生故障,事后都可以用任何一个镜像出来的本地仓库恢复。因为每一次的提取操作,实际上都是一次对代码仓库的完整备份。
在这里插入图片描述
这类系统都可以指定和若干不同的远端代码仓库进行交互。

1.2 Git 简史

  • 1991-2002年,绝大多数的 Linux 内核维护工作都花在了提交补丁和保存归档的繁琐事务上。
  • 2002,整个项目组开始启用分布式版本控制系统 BitKeeper 来管理和维护代码。
  • 2005,开发 BitKeeper 的商业公司同 Linux 内核开源社区的合作关系结束,他们收回了免费使用 BitKeeper 的权力。他们只有开发一套属于自己的版本控制系统才不至于重蹈覆辙。他们对新的系统制订了若干目标:
    • 速度
    • 简单的设计
    • 对非线性开发模式的强力支持(允许上千个并行开发的分支)
    • 完全分布式
    • 有能力高效管理类似 Linux 内核一样的超大规模项目(速度和数据量)
  • 之后,Git 日臻成熟完善。

1.3 Git 基础

1.3.1 直接记录快照,而非差异比较

Git 和其他版本控制系统的主要差别在于,Git 只关心文件数据的整体是否发生变化,而大多数其他系统则只关心文件内容的具体差异。这类系统(CVS,Subversion,Perforce,Bazaar 等等)每次记录有哪些文件作了更新,以及都更新了哪些行的什么内容。
在这里插入图片描述
实际上,Git 更像是把变化的文件作快照后,记录在一个微型的文件系统中。每次提交更新时,它会纵览一遍所有文件的指纹信息并对文件作一快照,然后保存一个指向这次快照的索引。
在这里插入图片描述
为提高性能,若文件没有变化,Git 不会再次保存,而只对上次保存的快照作一链接。

1.3.2 近乎所有操作都是本地执行

  • 在 Git 中的绝大多数操作都只需要访问本地文件和资源,不用连网。Git 在本地磁盘上就保存着所有当前项目的历史更新,所以处理起来速度飞快。
  • 例子
    • 如果要浏览项目的历史更新摘要,Git 不用跑到外面的服务器上去取数据回来,而直接从本地数据库读取后展示给你看。所以任何时候你都可以马上翻阅,无需等待。
    • 如果想要看当前版本的文件和一个月前的版本之间有何差异,Git 会取出一个月前的快照和当前文件作一次差异运算,而不用请求远程服务器来做这件事,或是把老版本的文件拉到本地来作比较。
    • 用 Git 的话,就算你在飞机或者火车上,都可以非常愉快地频繁提交更新,等到了有网络的时候再上传到远程仓库。

1.3.3 时刻保持数据完整性

  • 在保存到 Git 之前,所有数据都要进行内容的校验和(checksum)计算,并将此结果作为数据的唯一标识和索引。换句话说,不可能在你修改了文件或目录之后,Git 一无所知。
  • 作为 Git 的设计哲学,建在整体架构的最底层。所以如果文件在传输时变得不完整,或者磁盘损坏导致文件数据缺失,Git 都能立即察觉。
  • Git 使用 SHA-1 算法计算数据的校验和,通过对文件的内容或目录的结构计算出一个 SHA-1 哈希值,作为指纹字符串。
  • Git 的工作完全依赖于这类指纹字串,所以你会经常看到这样的哈希值。实际上,所有保存在 Git 数据库中的东西都是用此哈希值来作索引的,而不是靠文件名。

1.3.4 多数操作仅添加数据

  • 常用的 Git 操作大多仅仅是把数据添加到数据库。
  • 在 Git 里,一旦提交快照之后就完全不用担心丢失数据,特别是养成定期推送到其他仓库的习惯的话。
  • 这种高可靠性令我们的开发工作安心不少,尽管去做各种试验性的尝试好了,再怎样也不会弄丢数据。

1.3.5 文件三种状态

任何一个文件,在 Git 内都只有三种状态:
已提交(committed):表示该文件已经被安全地保存在本地数据库中了
已修改(modified):表示修改了某个文件,但还没有提交保存
已暂存(staged):表示把已修改的文件放在下次提交时要保存的清单中

文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库
在这里插入图片描述
基本的 Git 工作流程如下:

  • 在工作目录中修改某些文件。
  • 对修改后的文件进行快照,然后保存到暂存区域。
  • 提交更新,将保存在暂存区域的文件快照永久转储到 Git 目录中
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nsq_ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值