跳转到内容

Git 是什么?

欢迎来到 GitTour。在开始敲击任何命令之前,我们需要先调整一下思维频段。

你是否经历过这样的场景?为了防止修改出错,你在文件夹里留下了这样一堆文件:

  • 毕业论文_初稿.doc
  • 毕业论文_修改版.doc
  • 毕业论文_最终版.doc
  • 毕业论文_最终版_打死不改版.doc
  • 毕业论文_绝对最终版_v2.doc

随着时间的推移,你已经完全记不清 修改版最终版 之间到底改了什么,也不敢轻易删除任何一个旧文件。如果这个时候,你的电脑硬盘突然损坏,或者你不小心覆盖了最重要的那一段论述,灾难就发生了。

这就是手动版本控制,一种原始、脆弱且极易出错的工作方式。

Git,就是为了解决这个问题而诞生的终极工具。它不仅是一个文件备份系统,更是一台时间机器,允许你在项目的历史长河中自由穿梭,从任何一个时间点分叉出新的平行宇宙,并在未来将它们重新合并。

在深入 Git 的具体指令之前,我们需要先理解它的前世今生,以及它为何能成为当今软件开发的工业标准。

版本控制系统 (Version Control System, VCS) 是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。

虽然我们通常将 VCS 用于软件源代码管理,但实际上,你可以对任何类型的文件(文档、图片、布局文件等)进行版本控制。

一个优秀的版本控制系统应该能让你做到:

  • 回溯历史:将文件回退到上周甚至去年的状态。
  • 比较差异:查看现在的版本和以前的版本到底修改了哪些具体字符。
  • 归属追踪:清晰地知道是谁在什么时间修改了导致系统崩溃的那行代码。
  • 灾难恢复:如果文件丢失或损坏,可以轻松恢复。

为了实现这些目标,VCS 经历了三个阶段的演化。

阶段一:本地版本控制 (Local VCS)

Section titled “阶段一:本地版本控制 (Local VCS)”

早期的开发者为了解决手动复制文件的痛苦,开发了本地版本控制系统。最著名的是 RCS (Revision Control System)

  • 优点:简单,适合个人管理本地文档。
  • 缺点:无法协作。如果你的电脑坏了,所有历史记录随之灰飞烟灭。

阶段二:集中式版本控制 (Centralized VCS)

Section titled “阶段二:集中式版本控制 (Centralized VCS)”

为了解决协作问题,CVSSubversion (SVN)Perforce 等系统应运而生。它们的核心概念是:单一的集中管理服务器

在这个架构中,有一个中央服务器保存所有文件的修订版本,而协同工作的开发者通过客户端连接到这台服务器,检出(Checkout)文件进行修改,然后提交(Commit)。

  • 优点
    • 实现了多人协作。
    • 管理员可以轻松控制每个用户的权限。
  • 缺点
    • 单点故障 (Single Point of Failure):这是最致命的弱点。如果中央服务器宕机一小时,这一小时内所有人都无法提交更新,无法协同工作。如果服务器磁盘损坏且没有备份,所有的历史记录将永久丢失,客户端通常只保留了当前最新版本的文件快照。
    • 依赖网络:大多数操作(如查看历史、比较差异)都需要通过网络连接服务器,速度受限。

阶段三:分布式版本控制 (Distributed VCS)

Section titled “阶段三:分布式版本控制 (Distributed VCS)”

这就是 GitMercurialBazaar 所在的领域。

在分布式系统中,客户端不仅仅是检出最新版本的文件快照,而是把代码仓库完整地镜像下来

这意味着:

  1. 极强的容灾能力:每一次克隆(Clone)实际上都是一次对服务器的完整备份。如果服务器崩了,任何一个协作者的本地仓库都可以被用来恢复服务器,因为大家手里都有完整的数据。
  2. 离线工作:你可以在飞机的万米高空上提交代码、查看历史、创建分支。当你落地联网后,只需轻轻推送(Push)一下,将本地的变更同步到远程即可。
  3. 灵活的工作流:由于每个节点都是平等的,你可以同时与不同的远程仓库交互。这催生了 GitHub 等平台上的 Pull Request 工作流,使得开源贡献变得极其简单。

2. Git 的核心特性:思维模式的转变

Section titled “2. Git 的核心特性:思维模式的转变”

理解 Git 最困难的地方在于忘掉你对其他 VCS(如 SVN)的认知

Git 在底层概念上与其他系统完全不同。其他系统将数据看作是随时间积累的文件变更列表,而 Git 将数据看作是小型文件系统的一组快照

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

Section titled “2.1 直接记录快照,而非差异比较”

这是 Git 与 SVN 等系统最本质的区别。

  • 其他系统 (Delta-based): 它们存储的信息类似于:“文件 A 在版本 1 和版本 2 之间修改了第 3 行”。它们关注的是差异 (Delta)

  • Git (Snapshot-based): Git 更像是一个微型文件系统。当你提交更新时,Git 会对当前的全部文件制作一个快照 (Snapshot) 并保存这个快照的索引。

    • 高效存储:为了效率,如果文件内容没有变化,Git 不会重新存储该文件,新快照只是继续引用已有的对象(同一 blob id)。
    • 流式视角:Git 将其数据看作是一连串的快照流。

这种设计使得 Git 在分支切换和处理大型项目历史时,速度极其惊人。

2.2 近乎所有的操作都在本地执行

Section titled “2.2 近乎所有的操作都在本地执行”

在 Git 中,绝大多数操作只需要访问本地文件和资源。

  • 速度:想看项目历史?Git 不需要去服务器拉取数据,它直接从你本地的数据库读取,瞬间完成。
  • 独立性:你可以随时随地提交代码。你在火车上灵感爆发,写了两个小时代码,不仅可以保存,还可以将其分解为精细的、原子化的多次提交(Commits),完全不需要网络。

Git 使用 SHA-1 哈希算法来确保数据的完整性。

在数据被存储前,Git 会计算其校验和(Checksum)。这意味着,不可能在 Git 不知情的情况下更改任何文件内容或目录内容

Git 数据库中的东西不是通过文件名索引的,而是通过内容的哈希值索引的。如果你的磁盘出现坏道导致文件损坏,或者有人恶意篡改了数据,Git 会立即察觉。

在使用 Git 时,你会发现几乎所有的操作(Commit, Tag, Branch…)都是在往数据库里添加数据。

这为我们提供了一个巨大的安全网:

  • 难以丢失:一旦你提交了快照,就很难丢失它。
  • 可撤销:既然旧的操作记录还在,我们几乎总是有办法回退。

这也是为什么资深开发者敢于在 Git 中大胆尝试各种重构和实验的原因——因为我们知道,只要提交了,就有后悔药可吃。

除了上述的技术优势,Git 如今已经成为事实上的行业标准。

  • 生态系统:GitHub, GitLab, Bitbucket 等平台构建了庞大的社交编码生态。
  • 开源标配:几乎所有著名的开源项目(Linux, Android, React, Vue, Tensorflow…)都托管在 Git 上。
  • 职业技能:无论你是前端、后端、移动端还是运维,熟练掌握 Git 已经成为现代开发者的必备技能。

在接下来的章节中,我们将一步步揭开 Git 的神秘面纱,从最基础的安装开始,带你领略这个强大工具的魅力。准备好了吗?让我们开始吧。