Git 简明教程:从原理到实战
一、Git 的前世今生
诞生背景
Git 诞生于 2005 年,由 Linux 内核创始人 Linus Torvalds 开发。当时 Linux 内核开发团队使用的分布式版本控制工具 BitKeeper 停止免费授权,Linus 不满于现有工具的性能和可靠性,花了两周时间亲自编写了 Git 的核心代码。
发展历程
- 2005 年:首次发布,仅支持命令行操作
- 2008 年:GitHub 上线,推动 Git 成为行业标准
- 如今:Git 已成为全球最流行的版本控制系统,几乎所有软件开发团队都在使用
为什么选择 Git?
- 分布式:每个开发者都有完整的代码库,不依赖中央服务器
- 高性能:本地操作速度极快,适合大型项目(如 Linux 内核)
- 完整性:通过哈希算法确保代码不被篡改
- 灵活性:支持多种工作流,适应不同团队协作方式
二、Git 核心原理
1. 分布式架构
与 SVN 等集中式版本控制工具不同,Git 是分布式的:
- 没有单一的中央服务器(虽然实际开发中会用 GitHub/GitLab 作为协作中心)
- 每个开发者的本地仓库包含完整的代码历史和元数据
- 可离线工作,联网后再同步变更
2. 三个核心区域
Git 工作区分为三个关键区域:
- 工作区(Working Directory):我们实际编辑代码的地方
- 暂存区(Staging Area):临时存放即将提交的变更(也叫索引区)
- 本地仓库(Local Repository):存储所有提交历史的数据库
示意图:工作区 → 暂存区 → 本地仓库 → 远程仓库
3. 快照而非差异
Git 保存的是代码库在特定时刻的完整快照,而非文件间的差异。这使得版本切换和历史查看非常高效。每个提交都有一个唯一的哈希值(SHA-1 算法生成的 40 位字符串)作为标识。
三、Git 常用命令
第一阶段:初始化与配置
1. 安装验证
git --version # 示例输出:git version 2.34.1 |
2. 配置用户信息
首次使用 Git 必须配置,用于标识提交者身份:
git config --global user.name "Your Name" git config --global user.email "your.email@example.com" # 查看配置 git config --list |
场景:团队协作时,通过用户名和邮箱区分不同开发者的提交
3. 初始化本地仓库
# 创建并进入项目文件夹 mkdir my-project cd my-project # 初始化 Git 仓库 git init # 输出:Initialized empty Git repository in /path/to/my-project/.git/ |
场景:开始一个新项目时,将其转为 Git 管理的仓库
4. 克隆远程仓库
git clone https://github.com/example/user-repo.git # 克隆到指定文件夹 git clone https://github.com/example/user-repo.git my-folder |
场景:参与已有项目时,从远程仓库(如 GitHub)复制代码到本地
第二阶段:日常开发操作
5. 查看文件状态
git status # 简洁输出 git status -s |
示例输出:
On branch main Untracked files: (use "git add <file>..." to include in what will be committed) README.md |
场景:日常开发中,随时查看哪些文件有修改或未被跟踪
6. 添加文件到暂存区
# 添加单个文件 git add README.md # 添加所有修改的文件 git add . # 添加特定类型文件 git add *.js |
场景:完成某个功能点后,将相关文件加入暂存区准备提交
7. 提交变更到本地仓库
git commit -m "添加 README 文件,说明项目用途" |
提交规范建议:用简洁的语言描述 "做了什么",而非 "怎么实现的"
8. 查看提交历史
# 基本查看 git log # 简洁查看(一行显示一个提交) git log --oneline # 查看最近3次提交 git log -3 |
示例输出:
a1b2c3d (HEAD -> main) 添加 README 文件 e4f5g6h 初始化项目结构 |
场景:查看项目历史变更,或查找某个功能是何时添加的
9. 撤销工作区修改
git checkout -- README.md |
场景:误修改了文件,想恢复到最近一次提交的状态
10. 撤销暂存区文件
# 从暂存区移除,但保留工作区修改 git reset HEAD README.md |
场景:不小心把不需要提交的文件加入了暂存区
第三阶段:分支操作
11. 查看分支
git branch # 带详细信息的查看 git branch -v |
示例输出:
* main feature/login |
*表示当前所在分支
12. 创建分支
git branch feature/user-profile |
场景:开发新功能时,创建专门的分支,避免影响主分支
13. 切换分支
git checkout feature/user-profile # Git 2.23+ 推荐使用 git switch feature/user-profile |
场景:需要在不同功能分支间切换开发
14. 创建并切换分支(常用)
git checkout -b feature/payment # 或 git switch -c feature/payment |
场景:快速创建新分支并立即开始工作
15. 合并分支
# 先切换到目标分支(通常是 main 或 develop) git switch main # 合并 feature 分支 git merge feature/login |
场景:新功能开发完成后,将其合并到主分支
16. 删除分支
# 删除已合并的分支 git branch -d feature/login # 强制删除未合并的分支(谨慎使用) git branch -D feature/old-function |
场景:功能上线后,清理不再需要的开发分支
第四阶段:远程仓库交互
17. 查看远程仓库
git remote # 带详细信息 git remote -v |
示例输出:
origin https://github.com/example/my-project.git (fetch) origin https://github.com/example/my-project.git (push) |
18. 添加远程仓库
git remote add origin https://github.com/your-username/your-repo.git |
场景:将本地新建的仓库关联到远程 GitHub/GitLab 仓库
19. 拉取远程更新
git pull origin main |
场景:多人协作时,先获取远程最新代码,避免冲突
20. 推送本地提交
# 首次推送分支 git push -u origin main # 后续推送 git push origin main |
场景:完成本地开发后,将代码推送到远程仓库,供团队其他成员使用
21. 拉取远程分支
git pull origin feature/new-ui |
场景:获取团队其他成员在特定分支上的开发成果
第五阶段:进阶操作
22. 查看提交差异
# 工作区与暂存区的差异 git diff # 暂存区与本地仓库的差异 git diff --cached # 两个分支之间的差异 git diff main feature/payment |
场景:提交前检查修改内容,或比较不同分支的差异
23. 暂存工作区( stash )
# 暂存当前工作 git stash # 查看暂存列表 git stash list # 恢复最近的暂存 git stash pop # 恢复指定暂存 git stash apply stash@{1} |
场景:需要临时切换分支,但当前工作还不想提交时
24. 标签重要版本
# 创建标签(通常用于发布版本) git tag v1.0.0 # 带说明的标签 git tag -a v1.0.0 -m "正式发布1.0版本" # 推送标签到远程 git push origin v1.0.0 |
场景:发布正式版本时,给重要的提交打上标签,方便后续追溯
25. 回退到历史版本
# 方法1:保留后续修改(推荐) git revert a1b2c3d # 方法2:直接回退(会丢失后续提交,谨慎使用) git reset --hard a1b2c3d |
场景:发现最新提交有问题,需要恢复到之前的稳定版本
四、常用工作流示例
单人开发流程
- git clone 克隆仓库(首次)或 git pull 更新代码
- git switch -c feature/new-function 创建新功能分支
- 编写代码...
- git add . 添加修改
- git commit -m "实现xxx功能" 提交
- 重复 3-5 步完善功能
- git switch main 切换到主分支
- git merge feature/new-function 合并功能
- git push 推送到远程
团队协作流程
- 成员 A: git switch -c feature/login 开发登录功能并推送
- 成员 B: git pull origin feature/login 获取 A 的代码
- 成员 B: 在该分支继续开发并推送
- 功能完成后,通过 PR/MR(拉取请求)进行代码审查
- 审查通过后合并到主分支
- 其他成员: git pull origin main 获取最新主分支代码
五、学习资源
- 官方文档:https://git-scm.com/doc
- 可视化工具:GitKraken、SourceTree(适合新手理解 Git 操作)
- 在线练习:Learn Git Branching(https://learngitbranching.js.org/)