软件开发需求

在软件项目开发中,首先会发布基础功能版本v1.0.1,然后不断的迭代,增加新功能。每次修改都应该保存下来,并标识版本号,便于查看特定版本的修订情况。

核心概念

快照

https://www.zhihu.com/question/27680108?sort=created
每次文件修改时,版本控制系统都会拷贝一份,同时新的文件名是根据文件内容产生的hash值。快照就是把当前的所有文件复制一份(当然没有修改的文件不需要再复制,而是保留它的索引),并保存文件的索引值(hash值)。通过快照的索引值就能够找到所有的文件,还原项目文件的状态。从侧面也看出来快照不是文件的差异比较,而是直接复制最新的文件。
git底层原理 - 图1

本地版本控制系统

通过检查工作目录的文件变更,在硬盘上保存补丁集(补丁是指文件修订前后的变化);通过应用所有的补丁,可以重新计算出各个版本的文件内容。但是无法做到开发协同,同时有单点故障的风险。

集中化版本控制系统

该系统分为客户端和服务器,项目的历史版本都保存在服务器上,协同开发的人员在客户端只存储的某些快照数据。但是仍然有单点故障的风险,如果没有联网或者服务器宕机,所有的工作都没法进行,可能发生历史版本快照丢失的问题。

分布式版本控制系统

客户端不再是提取最新的项目快照,而是将仓库代码完整的镜像下来,包括完整的历史记录和快照。
git就是分布式版本控制工具。

github

github其实本质上也是客户端,作为代码的托管平台。保证多人协同开发时,每个人的仓库代码同步。

git本地文件结构

image.png

Git本地库和远程库的交互

git本地库和github代码托管中心之间的交互
image.png