Git中文社区

Git 简介

Git 是目前世界上最流行的分布式版本控制系统。本章我们将学习什么是版本控制,以及 Git 为什么如此受欢迎。

什么是版本控制

版本控制用于追踪和管理文件的修改(一般为代码和文档),通过版本管理我们可以:

  • 实现时光穿梭机,可以将文件回退到之前的任意状态。
  • 比较文件差异,查看是谁、在什么时候、修改了什么内容。
  • 适合团队协同,多人同时修改同一个项目,最后把各自的修改合并到一起。
  • 放心地做实验,后悔了可以一键恢复之前的版本。

想象如果没有 "版本控制",你是不是这样干过,复制文件夹然后改名为 项目-副本1、项目-副本2、项目-最终版…… 这种方式虽然简单,但极易出错,也无法多人协作。

版本控制系统的演进

版本控制一般分为 "分布式版本控制" 和 "集中式版本控制"。早期用到较多的是 SVN 这样的集中式版本控制,直到 Git、Mercurial 的发布后才开始流行分布式版本控制,2010 年随着 GitHub、GitLab 这类托管平台的走红,Git 迅速成为了主流。据 StackOverflow 2022 年调查,96% 的开发者在使用 Git。

集中式版本控制

为了让不同机器上的开发者协同工作,出现了 CVS、Subversion(SVN)等集中式版本控制系统。它们有一个单一的中央服务器保存所有文件的修订版本,开发者需要联网从服务器取出最新文件或提交更新。

集中式的最大问题是单点故障:服务器宕机期间无法提交修改,如果中心数据库损坏又没有备份,所有历史记录都会丢失。

分布式版本控制

在 Git、Mercurial 这类分布式版本控制系统中,客户端并不只是取出最新的文件快照,而是把整个仓库(包括完整的历史记录)都克隆到本地。每个开发者的电脑上都有一份完整的仓库,没有单点故障,离线也能工作。

Git 的诞生

2005 年,Linux 内核开发社区与此前使用的商业版本控制系统 BitKeeper 终止了合作。Linux 之父 Linus Torvalds 决定自己动手,仅用了大约两周时间就写出了 Git 的第一个版本。Git 的设计目标包括:

  • 速度快;
  • 设计简单;
  • 对非线性开发模式的强力支持(允许成千上万个并行分支);
  • 完全分布式;
  • 有能力高效管理类似 Linux 内核这样的超大规模项目。

如今,Git 已经成为事实上的行业标准,GitHub、GitLab、Gitee 等代码托管平台都以 Git 为核心。

Git 的核心特点

直接记录快照,而非差异

大多数其他系统以"文件的变更列表"方式存储信息。Git 则不同:每次提交时,Git 会对当时的全部文件创建一个快照并保存其索引。为了效率,如果文件没有修改,Git 不会重新存储该文件,而是只保留一个指向之前存储文件的链接。

几乎所有操作都在本地执行

因为本地就有完整的历史,浏览项目历史、比较版本差异、提交修改等操作都不需要联网,速度极快。即使在飞机上、没有网络的地方,你也可以照常工作,等有网络时再推送。

保证完整性

Git 中所有数据在存储前都会计算校验和(SHA-1 哈希),然后以校验和来引用。这意味着不可能在 Git 不知情的情况下更改任何文件内容或目录。一个 SHA-1 哈希看起来像这样:

24b9da6552252987aa493b52f8696cd6d3b00373

一般只添加数据

你执行的几乎所有 Git 操作,都只是往 Git 数据库中添加数据。一旦提交了快照,就很难再丢失数据。这让我们可以放心地尝试各种操作而不必担心搞坏什么。

Git 与 GitHub 的区别

初学者经常把两者混为一谈:

名称是什么
Git一个开源的版本控制工具,安装在你的电脑上
GitHub一个基于 Git 的代码托管平台,提供远程仓库、Pull Request、Issue 等协作功能
GitLabGitHub 本身是闭源的,而 GitLab 是一个开源的,可自行部署的代码托管平台,很多公司内部都在使用它

简单来说:Git 是工具,GitHub/GitLab 是使用这个工具的"网盘 + 协作社区"。

提示

学习 Git 不需要先注册任何平台。本教程的前半部分都可以在本地完成,到"远程仓库"一章再接触托管平台即可。