外观
Git 简介
什么是 Git
Git 是一个分布式版本控制系统 (Distributed Version Control System,DVCS),主要用于跟踪文件的变化、协作开发与版本管理。 它最初由 Linus Torvalds (Linux 之父) 在 2005 年创建,用来管理 Linux 内核的源码版本。 如今,Git 已成为几乎所有软件开发项目的标准版本控制工具。
简而言之:
Git = 记录文件变化 + 多人协作开发 + 可追溯历史 + 分支灵活。
Git 的优势
在团队开发中,单靠人工保存不同版本 (如 project_v1.zip、project_final_final.zip) 是不现实的。
| 优势 | 说明 |
|---|---|
| 分布式架构 | 每个开发者的电脑都是一个完整的代码仓库(含完整历史),不依赖中央服务器。 |
| 高效性能 | 几乎所有操作都在本地完成,速度极快。 |
| 强大的分支系统 | 创建、切换、合并分支极为轻量。 |
| 安全可靠 | 使用 SHA-1 哈希算法保证数据完整性,不易被篡改。 |
| 协作友好 | 配合 GitHub、GitLab、Gitee 等平台,轻松实现团队协作。 |
Git 的发展历史
| 时间 | 事件 |
|---|---|
| 2002 年前 | Linux 内核开发使用 BitKeeper(商业版控制系统)。 |
| 2005 年 | BitKeeper 收回 Linux 使用授权,Linus Torvalds 开始自研 Git。 |
| 2005 年 4 月 | Git 初版发布,仅用 10 天开发出核心原型。 |
| 2008 年 | GitHub 上线,使 Git 的协作与社交开发爆发式增长。 |
| 2010 年后 | 成为全球主流版本控制系统,几乎所有开源项目均采用 Git。 |
Git 核心概念详解
仓库 (Repository)
存储项目所有文件和版本历史的地方。
本地仓库结构:
/project/
├── .git/ # Git 数据库
│ ├── objects/ # 存储所有数据内容
│ ├── refs/ # 存储指向数据的指针
│ └── HEAD # 指向当前分支
└── 源代码文件工作区、暂存区、仓库
工作区 (Working Directory) 暂存区 (Staging Area) 仓库 (Repository)
↓ ↓ ↓
[ 修改文件 ] -- git add --> [ 准备提交 ] -- git commit --> [ 永久保存 ]
↑ ↑ ↑
[ 实际文件 ] [ 临时区域 ] [ 版本历史 ]提交 (Commit)
代码变化的快照,包含:
- 唯一的 SHA-1 哈希 ID
- 作者信息
- 提交信息
- 指向父提交的指针
提交链示意图:
C1 <-- C2 <-- C3 <-- C4
↑ ↑
第一次提交 最新提交分支 (Branch)
指向某个提交的轻量级可移动指针。
主分支开发:
main
↓
C1 ← C2 ← C3 ← C4
创建功能分支:
main
↓
C1 ← C2 ← C3 ← C4
\
C5 ← C6
↑
feature合并 (Merge)
将不同分支的修改整合到一起。
合并前:
main
↓
C1 ← C2 ← C3 ← C4
\
C5 ← C6
↑
feature
合并后:
main
↓
C1 ← C2 ← C3 ← C4 ← M
\ /
C5 ← C6远程仓库 (Remote)
托管在服务器上的仓库副本,用于团队协作。
本地与远程协作:
本地仓库 -- push/pull --> 远程仓库 (GitHub/GitLab)
↓ ↓
[ 你的修改 ] <-- 同步代码 --> [ 团队共享代码 ]Git 工作流程示意图
典型开发流程:
工作区 暂存区 本地仓库 远程仓库
↓ ↓ ↓ ↓
[修改文件]
├─ git add ─→ [暂存变更]
│ ├─ git commit ─→ [新提交]
│ │ ├─ git push ────→ [更新远程]
│ │ │
│ ←─ git reset ───┘ │
←─ git checkout ───────────────────┘
│
←─ git pull ─────────────────────────────┘
│
[查看状态] ─── git status ─→ [显示状态信息]分支工作流示意图
Git Flow 示例:
main分支: ○──○──○─────────○─────────────○─────○
│ │ │ │ │ │
dev分支: └──○──○──○──○──○─────────────○─────○
│ │ │ │ │ │ │
feature/A: └────○──○──┘ │ │ │
│ │ │ │
feature/B: └────────○──○───────┘ │
│ │ │
hotfix: └──○──────────────┘
○ = 提交
连线 = 分支关系