Git: Git简介与版本控制概念
Git 是世界上最流行的分布式版本控制系统——它让团队协作变得简单高效。
本教程面向零基础学习者,从版本控制概念讲起,直到你能熟练使用Git进行团队协作。
1. 你将学到
- 版本控制的基本概念
- Git的诞生历史和设计哲学
- 分布式vs集中式版本控制
- Git的核心优势
- Git的应用场景
2. 什么是版本控制
版本控制(Version Control)是一种记录文件内容变化,以便将来查阅特定版本的系统。
(1) 为什么需要版本控制?
想象你正在写一篇论文:
论文-v1.doc # 第一版
论文-v2.doc # 修改了一些内容
论文-最终版.doc # 导师说还要改
论文-最终版2.doc # 又改了一些
论文-打死不改版.doc # 真的是最后一版了
论文-打死不改版2.doc # 好吧,还得改...
这种方式的问题:
- 文件命名混乱:哪个才是真正的最终版?
- 无法追溯:不知道每次改了什么
- 容易出错:可能改错了文件版本
- 协作困难:多人修改同一文件怎么办?
版本控制系统就是为了解决这些问题而诞生的。
3. 版本控制的演进
(1) 3.1 本地版本控制
最早期的版本控制,在本地保存文件的所有版本。
graph TB
A[本地数据库<br/>v1, v2, v3] --> B[工作区]
代表工具: RCS(Revision Control System)
缺点: 无法多人协作
(2) 3.2 集中式版本控制
所有版本数据集中存储在一台服务器上,团队成员从服务器获取文件,修改后再提交回去。
graph TB
S[中央服务器<br/>所有版本]
S --> A[用户A]
S --> B[用户B]
S --> C[用户C]
代表工具: CVS、Subversion(SVN)、Perforce
优点:
- 管理方便,权限控制容易
- 每个人都能看到别人在做什么
缺点:
- 单点故障:服务器宕机,所有人都无法工作
- 网络依赖:必须联网才能工作
- 速度慢:所有操作都要访问服务器
(3) 3.3 分布式版本控制
每个开发者都拥有完整的版本库(仓库),包括所有历史记录。
graph LR
A[用户A仓库<br/>完整历史] <--> B[用户B仓库<br/>完整历史]
B <--> C[用户C仓库<br/>完整历史]
A <--> C
代表工具: Git、Mercurial、Bazaar
优点:
- 离线工作:不需要联网就能提交、查看历史、创建分支
- 速度快:大多数操作在本地完成
- 容灾性强:每个人的仓库都是完整备份
- 灵活的工作流:支持多种协作模式
缺点:
- 初次克隆较慢(需要下载完整历史)
- 概念相对复杂
4. Git的诞生
(1) 4.1 Git的由来
2005年,Linux内核开发社区发生了一件大事:
- Linux内核项目一直使用专有的BitKeeper版本控制系统
- BitKeeper的所有者BitMover公司收回了免费使用权
- Linux创始人Linus Torvalds决定自己开发一个新的版本控制系统
Git的设计目标:
- 速度:必须非常快
- 简单:设计要简洁优雅
- 支持非线性开发:允许成千上万个并行分支
- 完全分布式:每个开发者都有完整仓库
- 高效处理大型项目:如Linux内核
Linus在2005年4月用大约2周时间完成了Git的初始版本。如今,Git已成为世界上最流行的版本控制系统。
(2) 4.2 Git的设计哲学
Git的设计体现了几个核心思想:
快照而非差异
其他系统(如SVN)存储的是文件之间的差异:
v1: file.txt (原始文件)
v2: file.txt + diff1 (存储差异)
v3: file.txt + diff1 + diff2 (累积差异)
Git存储的是每次提交的完整快照:
v1: file.txt的完整快照
v2: file.txt的完整快照
v3: file.txt的完整快照
优点:
- 切换版本速度极快(直接读取快照)
- 分支创建成本低(只是指针)
几乎所有操作都在本地
- 查看历史:本地
- 提交修改:本地
- 创建分支:本地
- 切换分支:本地
只有推送和拉取需要联网。
5. Git的核心概念
(1) 5.1 仓库(Repository)
仓库是Git的核心概念,包含:
- 工作区(Working Directory):你实际编辑的文件
- 暂存区(Staging Area):准备提交的修改
- 版本库(Repository):所有提交的历史记录
graph TB
subgraph Git仓库
R[版本库 .git<br/>所有提交历史<br/>所有分支信息]
S[暂存区 Stage<br/>准备提交的修改]
W[工作区 Work<br/>实际编辑的文件]
end
W -->|git add| S
S -->|git commit| R
(2) 5.2 提交(Commit)
提交是Git的基本单位,包含:
- 快照:所有文件在某个时刻的状态
- 元数据:作者、时间、提交信息、父提交
- 唯一标识:40位的SHA-1哈希值
commit a1b2c3d4e5f6... (40位哈希)
Author: 张三 <zhangsan@example.com>
Date: 2024年1月1日 10:00:00
添加用户登录功能
(3) 5.3 分支(Branch)
分支是指向某个提交的可移动指针。Git的分支创建成本极低,只是创建一个41字节的文件(40字节哈希+1字节换行符)。
graph LR
C1[提交C1] --> C2[提交C2] --> C3[提交C3]
main[main分支] --> C3
feature[feature分支] --> C3
6. Git的应用场景
(1) 6.1 个人项目
- 记录修改历史:随时回退到任意版本
- 尝试新功能:创建分支实验,失败就删除
- 备份代码:推送到远程仓库作为备份
(2) 6.2 团队协作
- 并行开发:多人同时在不同分支工作
- 代码审查:Pull Request机制
- 冲突解决:自动合并,手动解决冲突
(3) 6.3 开源项目
- Fork工作流:先Fork,再修改,最后提PR
- 贡献代码:向项目提交Pull Request
- 跟踪上游:保持与原始项目同步
(4) 6.4 持续集成/持续部署(CI/CD)
- 自动化测试:提交代码后自动运行测试
- 自动部署:测试通过后自动部署
- 版本发布:打标签发布新版本
7. Git与其他版本控制的对比
| 特性 | Git | SVN | CVS |
|---|---|---|---|
| 架构 | 分布式 | 集中式 | 集中式 |
| 离线工作 | ✅ 完全支持 | ❌ 不支持 | ❌ 不支持 |
| 分支创建 | 极快(O(1)) | 慢(复制目录) | 不支持 |
| 存储方式 | 快照 | 差异 | 差异 |
| 网络依赖 | 仅推送/拉取 | 所有操作 | 所有操作 |
| 容灾性 | 高(每人完整备份) | 低(依赖服务器) | 低 |
▶ 示例:Git基本命令
# 初始化Git仓库
git init
# 查看仓库状态
git status
# 添加文件到暂存区
git add .
# 提交更改
git commit -m "初始提交"
# 查看提交历史
git log
❓ 常见问题
📖 小节
- 版本控制是记录文件变化的系统,解决版本混乱、协作困难等问题
- 版本控制经历了本地→集中式→分布式的演进
- Git由Linus Torvalds在2005年创建,设计目标是速度、简单、分布式
- Git存储快照而非差异,几乎所有操作都在本地完成
- Git的核心概念:仓库、提交、分支
- Git适用于个人项目、团队协作、开源项目、CI/CD等场景
📝 作业
-
基础题:用自己的话解释"分布式版本控制"和"集中式版本控制"的区别,至少列出3点。
-
进阶题:调研你身边的项目或公司,了解他们使用什么版本控制工具,为什么选择这个工具?
-
挑战题:阅读Linus Torvalds关于Git的原始邮件(搜索"Linus Torvalds Git mailing list"),了解Git诞生的背景和设计理念。