git 起源

概述

本文首先介绍了三种版本控制系统,并简要指明各自优缺点,随后介绍了 git 及首次安装所需的若干配置。

版本控制系统

版本控制系统 就是一种记录若干文件内容变化,以便将来查阅特定版本修订情况的系统。换言之,借助于该系统,我们可以保存若干文件的历史版本,并根据需要能够快速获取指定版本的具体内容。

本地版本控制系统

最基本的版本控制系统应当是这样的 —— 复制整个项目所在目录以保存不同版本,同时为项目目录名添加时间以示区别。这种位于本机的版本控制系统称为 本地版本控制系统

经过若干年发展,本地版本控制系统大多基于如下原理进行实现:使用某种简单数据库存储项目文件的历次更新差异。

图一:本地版本控制系统

在这其中,最为流行的便是 RCS,它在硬盘之上保存补丁集 (即文件修订前后的变化),通过应用所有补丁,可以计算得到各个版本的具体内容。

本地版本控制系统具有如下优缺点:

  • 优点
    • 便于个人管理项目。
  • 缺点
    • 无法实现多人合作同时开发项目。

集中式版本控制系统

本地版本控制系统存在一个最大的问题:无法实现多人合作同时开发项目。为解决此问题,集中式版本控制系统 应运而生。集中式版本控制系统大多基于如下原理实现:单一集中管理的服务器存储项目文件的所有历史版本 (基于保存版本文件间差异而实现,也可以直接称为补丁集),协同工作的人们通过客户端连接到服务器,取出最新项目文件开始工作,随后执行提交操作以更新项目文件。

图二:集中式版本控制系统

集中式版本控制系统具有如下优缺点:

  • 优点
    • 方便管理、操作简单、易于上手。
    • 集中式服务器更能保证安全性。
    • 项目一致性非常高。
  • 缺点
    • 服务器性能要求极高。如果服务器发生宕机,这段时间便无法协同开发项目;如果服务器磁盘发生损坏,可能导致项目所有版本数据丢失。
    • 必须联网以开发项目 (这是集中式版本控制系统的劣势)。
    • 分支管控功能不够灵活。

分布式版本控制系统

为解决集中式版本控制系统的若干缺点,分布式版本控制系统被提出。

图三:分布式版本控制系统

相比于集中式版本控制系统而言,它具有如下特征:

  1. 客户端不仅提取最新项目文件,而且将其所有历史版本一同提取到本机。如此操作,一旦存放项目文件的服务器 (此处的服务器与集中式版本控制系统中的服务器含义不同,此处的服务器仅用于托管项目文件) 发生故障,即可使用本地所存文件进行恢复。
  2. 客户端不仅可以同服务器进行交互以开发项目;而且可以直接与其他用户进行交互以开发项目。

分布式版本控制系统具有如下优缺点:

  • 优点
    • 项目文件本地化,更能保证项目文件的完整性。
    • 不联网时也可完成项目开发。
    • 分支管控功能往往十分灵活、强大。
  • 缺点
    • 学习成本高,不容易上手。

git

我们在此介绍一种十分著名、广泛使用的分布式版本控制系统 —— git

经过多年发展,git 已日臻完善,并具有如下特征:

  1. 设计简单、易于上手。
  2. 速度飞快,适合大项目管理。
  3. 完全分布式。
  4. 具有极其强大的分支管理系统,以保证对非线性开发模式的强力支持。

介绍

这里,我们借由差异对比以介绍 git 工具:

  1. 对于其他版本控制系统而言,它们将所需存储的项目文件看作是一组基本文件和每个文件随时间逐步积累的差异 (这种类型的版本控制系统可统称为 基于差异的版本控制系统)。

    图四:其他版本控制系统的项目文件

    对于 git 而言,每更新一次项目状态,它就为项目所有文件创建快照 (可简单理解为当前项目所有文件的一个副本) 并保存该快照的索引。如果某文件未曾发生变动,则仅保留一个指向之前存储该文件的链接。故而,git 将所需存储的项目文件看作为 快照流

    图五:git 的项目文件

  2. 为实现多人合作项目开发,其他版本控制系统基本都需要进行联网;对于 git 而言,绝大多数操作均为本地操作,仅有少数操作需要进行联网。

  3. git 底层使用 SHA-1 计算文件校验和,并以此作为文件索引。

  4. git 将项目中文件分为三种状态:已提交 (commited)、已暂存 (staged)、已修改 (modified)。已修改表示修改了文件,但还未对其做任何管理操作;已暂存表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中;已提交表示数据已经安全地保存在本地仓库中。

    根据这三种文件状态,git 项目拥有三种阶段 —— 工作区、暂存区以及 Git 仓库 (也称仓库区、本地仓库、版本库)。

    图六:git 项目阶段

    工作区是对项目的某个版本独立提取出来的内容。 这些从 Git 仓库的压缩数据库中提取出来,放在磁盘上供你使用或修改。

    暂存区是一个文件,保存了下次将要提交的文件列表信息,一般在 Git 仓库目录中。 按照 Git 术语,其应当称为 “index”,但一般还是称为“暂存区”。

    Git 仓库是 Git 用来保存项目元数据和对象数据库的地方。 这是 Git 中最重要的部分,它具体表现为 .git 文件夹。

安装

https://git-scm.com/downloads 下载相应平台版本后,傻瓜式安装即可。

配置

首次下载 git 工具后,我们需要执行一些信息配置工作。git 提供 git config 命令帮助设置控制 Git 外观和行为相关的配置变量。根据使用命令的具体参数不同,这些变量将存储于三种不同的位置:

  1. /etc/gitconfig 文件:包含系统级通用配置信息。如果使用 git config --system 配置变量,其将位于此文件中。在 Windows 系统中,其通常位于 C:\Documents and Settings\All Users\Application Data\Git\config
  2. ~/.gitconfig 文件:包含用户级通用配置信息。如果使用 git config --global 配置变量,其将位于此文件中。在 Windows 系统中,其通常位于 C:/User/$User/.gitconfig
  3. 当前仓库下 .git 文件:包含本仓库的配置信息。如果直接使用 git config 配置变量,其将位于此文件中。

变量配置是否生效基于就近原则,即当前仓库下 .git 文件中的配置信息将会覆盖 ~/.gitconfig 文件中的配置信息,~/.gitconfig 文件中的配置信息将会覆盖 /etc/gitconfig 文件中的配置信息。

由于每次提交到 Git 仓库需要使用个人信息,因此我们需要配置用户名和邮件地址信息:

1
2
$ git config --global user.name "John Doe"
$ git config --global user.email johndoe@example.com

另外我们也可通过 git config --list --show-orign 查看所有已配置的变量信息及其所在文件位置。借于此,我们可以知道哪些变量可配置,从而使用 git config 命令修改现有配置。