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 等协作功能 |
| GitLab | GitHub 本身是闭源的,而 GitLab 是一个开源的,可自行部署的代码托管平台,很多公司内部都在使用它 |
简单来说:Git 是工具,GitHub/GitLab 是使用这个工具的"网盘 + 协作社区"。
提示
学习 Git 不需要先注册任何平台。本教程的前半部分都可以在本地完成,到"远程仓库"一章再接触托管平台即可。