版本控制系统通过不同的架构方式实现其核心功能。历史上,管理版本主要有两种架构方式:集中式和分布式。了解这种区别很重要,因为它解释了Git提供的许多优点。集中式版本控制系统 (CVCS)想象一个图书馆,每本书只有一个主副本。要进行修改,你需要借出这本书,编辑它,然后再还回。集中式版本控制系统的工作方式与此类似。在CVCS中,有一个单独的中央服务器存储所有版本化的文件及其历史记录。开发人员或“客户端”连接到这个中央服务器以“检出”他们需要处理的文件。当他们做出修改后,他们将这些修改直接“提交”回中央服务器。流行的CVCS例子包括Subversion (SVN) 和CVS。这里是CVCS模式的一个简化视图:digraph G { rankdir=TB; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style=filled]; edge [color="#495057"]; subgraph cluster_clients { label = "开发人员(客户端)"; bgcolor="#f8f9fa"; style=filled; bordercolor="#dee2e6"; DevA [label="开发人员 A\n(工作副本)"]; DevB [label="开发人员 B\n(工作副本)"]; DevC [label="开发人员 C\n(工作副本)"]; } Server [label="中央VCS服务器\n(完整历史记录)", shape=cylinder, fillcolor="#a5d8ff", color="#1c7ed6"]; DevA -> Server [label=" 检出 / 提交"]; DevB -> Server [label=" 检出 / 提交"]; DevC -> Server [label=" 检出 / 提交"]; }集中式VCS有一个主服务器保存所有历史记录,开发人员直接与其交互。CVCS的优点:模型更简单: 单一真理源的理念对于初学者来说通常更容易理解。集中管理: 借助一个中央管理点,管理用户访问和权限有时会更简单。CVCS的缺点:单点故障: 如果中央服务器宕机或磁盘损坏,任何人都无法提交更改、查看历史记录或协作。如果备份不完善,历史记录可能会丢失。网络依赖: 大多数操作(如提交、查看历史差异或分支)都需要连接到中央服务器。离线工作受到很大限制。性能: 由于几乎所有涉及历史记录的命令都需要与中央服务器进行网络通信,操作可能会较慢。分布式版本控制系统 (DVCS)分布式版本控制系统,如Git,采用了一种根本不同的方法。开发人员不再仅仅检出文件的最新版本,而是“克隆”整个仓库,包括其完整历史记录。回想一下图书馆的比喻。在分布式模式下,这就像每个人都有自己的复印机,并制作了整个图书馆的完整副本。他们可以在自己的副本中阅读任何书籍,比较过去的版本,并完全撰写新草稿。当他们想分享自己的新草稿时,他们会与其他人或主图书馆进行协调。对于DVCS,每个开发人员的工作副本也都是一个包含项目历史记录的完整仓库。这意味着大多数操作,如提交更改、查看旧版本、创建分支和比较差异,都在开发人员的本地机器上执行。它们非常快速,因为它们不需要网络访问。协作是通过同步仓库发生的——将你的本地更改推送到另一个仓库,或从另一个仓库拉取更改到你的仓库。虽然通常会将一个仓库指定为“中央”或“源”仓库(例如GitHub或GitLab上托管的仓库),但Git本身并不强制这样做;任何仓库在技术上都可以与任何其他仓库同步。这里是DVCS模式的一个简化视图:digraph G { rankdir=TB; node [shape=box, style=rounded, fontname="sans-serif", color="#495057", fillcolor="#e9ecef", style=filled]; edge [color="#495057"]; subgraph cluster_nodes { label = "开发人员(完整副本)"; bgcolor="#f8f9fa"; style=filled; bordercolor="#dee2e6"; DevA [label="开发人员 A\n(完整仓库)"]; DevB [label="开发人员 B\n(完整仓库)"]; DevC [label="开发人员 C\n(完整仓库)"]; } Server [label="共享远程仓库\n(通常为“origin”)", shape=cylinder, fillcolor="#96f2d7", color="#0ca678"]; DevA -> Server [dir=both, label=" 推送 / 拉取"]; DevB -> Server [dir=both, label=" 推送 / 拉取"]; DevC -> Server [dir=both, label=" 推送 / 拉取"]; // 可选的对等交互(不常见但可能) // DevA -> DevB [style=dashed, dir=both, label=" 同步"]; }分布式VCS为每个开发人员提供仓库历史的完整副本,支持本地操作和灵活的同步。DVCS(如Git)的优点:弹性: 如果任何单个服务器或开发人员的机器发生故障,完整的仓库历史记录仍然存在于许多其他机器上。恢复要容易得多。速度: 大多数操作(提交、分支、查看历史记录、比较差异)都是本地的,因此非常快。你只有在想要分享更改(推送)或获取更新(拉取/获取)时才需要网络访问。离线工作: 你可以在没有互联网连接的情况下提交、创建分支、查看历史记录等等。你只需要在线即可与他人同步。灵活的工作流程: 分布式特性支持多种协作模式,而非简单的集中式方法。DVCS的缺点:首次克隆: 首次克隆一个非常大的仓库可能比从CVCS检出需要更长的时间,因为你正在下载整个历史记录。然而,随后的操作会快得多。理解开销: 理解本地仓库和远程仓库之间的区别,与CVCS模式相比,需要进行一些思维转变。为何分布式方式很重要尽管集中式系统完成了其职责,Git及其他DVCS提供的分布式模式已成为现代软件开发和协作的标准。它抗数据丢失的能力、本地操作的速度以及离线工作和以多种方式进行协作的灵活性,都是显著的优点。本课程侧重于Git,最流行的DVCS,为你提供有效管理项目所需的技能,采用这种有用的分布式方法。