Files
test-repo/docs/zh-cn/appendix/git-intro.md
T
2026-01-15 20:10:19 +08:00

756 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Git 详细介绍
> 💡 **学习指南**:Git 是现代软件开发必备的版本控制工具。本章节将通过可视化演示和实战案例,带你从零掌握 Git 的核心概念、常用命令和工作流程。
## 0. 快速体验:Git 工作流
让我们先通过交互式演示,理解 Git 的核心概念:
<GitWorkflowDemo />
## 1. 什么是 Git
### 1.1 版本控制的必要性
**场景**:你在写论文,保存了多个版本:
```
论文_最终版.docx
论文_最终版_v2.docx
论文_最终版_真的最终版.docx
论文_最终版_打死不改版.docx
```
**问题**
- ❌ 无法快速找回历史版本
- ❌ 无法知道改了什么
- ❌ 多人协作容易冲突
**Git 的解决方案**
- ✅ 自动记录所有历史
- ✅ 清晰的版本对比
- ✅ 方便的分支管理
- ✅ 高效的团队协作
### 1.2 Git 的特点
- **分布式**:每个开发者都有完整的代码仓库
- **快速**:大部分操作在本地完成
- **分支管理**:轻量级的分支创建和切换
- **数据完整性**:内容寻址,确保数据不被损坏
## 2. Git 核心概念
### 2.1 三个区域
Git 工作流程涉及三个区域:
```
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ 工作区 │ ──▶ │ 暂存区 │ ──▶ │ 仓库 │
│ (Working) │ add │ (Staging) │ commit│ (Repository)│
│ │ │ │ │ │
│ 实际文件 │ │ 准备提交 │ │ 永久历史 │
└─────────────┘ └─────────────┘ └─────────────┘
```
**工作区 (Working Directory)**
- 你实际看到的文件
- 可以随意修改
**暂存区 (Staging Area)**
- 准备提交的文件
- 通过 `git add` 添加
**仓库 (Repository)**
- Git 保存历史记录的地方
- 通过 `git commit` 提交
### 2.2 文件状态
```
未跟踪 (Untracked) → 已修改 (Modified) → 已暂存 (Staged) → 已提交 (Committed)
```
- **未跟踪**:新文件,Git 未管理
- **已修改**:文件已改变,未添加到暂存区
- **已暂存**:文件已添加到暂存区,等待提交
- **已提交**:文件已保存到仓库
## 3. Git 基础命令
### 3.1 初始化仓库
```bash
# 创建新的 Git 仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
```
### 3.2 查看状态
```bash
# 查看当前状态
git status
# 查看简化状态
git status -s
```
**输出示例**
```
M modified.txt # 已修改
A new.txt # 已添加
?? untracked.txt # 未跟踪
```
### 3.3 添加文件
```bash
# 添加单个文件
git add file.txt
# 添加所有文件
git add .
# 添加所有修改的文件
git add -u
# 交互式添加
git add -i
```
### 3.4 提交更改
```bash
# 提交并添加说明
git commit -m "提交信息"
# 添加并提交(跳过 git add
git commit -am "提交信息"
# 修改最后一次提交
git commit --amend
# 查看提交历史
git log
# 查看简洁历史
git log --oneline
```
**提交信息规范**
```bash
# 好的提交信息
git commit -m "feat: 添加用户登录功能"
git commit -m "fix: 修复导航栏显示错误"
git commit -m "docs: 更新 README 文档"
# 提交信息类型
feat: 新功能
fix: 修复 bug
docs: 文档更新
style: 代码格式调整
refactor: 重构代码
test: 添加测试
chore: 构建/工具链更新
```
## 4. 分支管理
### 4.1 什么是分支?
分支是独立的开发线,让你可以:
- 同时进行多个任务
- 不影响主线代码
- 安全地实验新想法
**分支可视化**
```
main branch: ●────●────●────●────●
feature: └────●────●
分支点 新提交
```
### 4.2 分支命令
```bash
# 查看所有分支
git branch
# 创建新分支
git branch feature-login
# 切换分支
git checkout feature-login
# 或
git switch feature-login
# 创建并切换分支
git checkout -b feature-login
# 或
git switch -c feature-login
# 删除分支
git branch -d feature-login
# 强制删除分支
git branch -D feature-login
# 查看分支合并情况
git log --graph --oneline --all
```
### 4.3 合并分支
**合并方式 1:普通合并**
```bash
# 切换到主分支
git checkout main
# 合并 feature 分支
git merge feature-login
```
**合并方式 2:变基 (Rebase)**
```bash
# 将 feature 分支的提交接到 main 最新提交
git checkout feature-login
git rebase main
```
**区别**
- **merge**:保留完整历史,有分叉
- **rebase**:线性历史,更清晰
**可视化**
```
# Merge 结果
main: ●────●────●────●
└────● (merge commit)
feature: └────●
# Rebase 结果
main: ●────●────●────●────●
feature: └────● (moved here)
```
### 4.4 冲突解决
**当合并产生冲突时**
```bash
# Git 会提示冲突
git merge feature-login
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt
```
**解决步骤**
1. 查看冲突文件:
```bash
# 标记冲突文件
git status
```
2. 编辑文件,解决冲突:
```python
# <<<<<<< HEAD
# 当前分支的代码
# =======
# feature 分支的代码
# >>>>>>> feature-login
# 改为你想要的代码
```
3. 标记冲突已解决:
```bash
git add file.txt
git commit
```
## 5. 远程仓库
### 5.1 查看远程仓库
```bash
# 查看远程仓库
git remote
# 查看详细信息
git remote -v
# 查看远程仓库信息
git remote show origin
```
### 5.2 推送到远程
```bash
# 推送到远程仓库
git push origin main
# 推送所有分支
git push --all origin
# 推送标签
git push --tags
# 首次推送分支(设置上游)
git push -u origin feature-login
```
### 5.3 从远程拉取
```bash
# 拉取并合并
git pull origin main
# 等价于
git fetch origin main
git merge origin/main
# 仅拉取不合并
git fetch origin
```
### 5.4 远程分支
```bash
# 查看远程分支
git branch -r
# 基于远程分支创建本地分支
git checkout -b local-branch origin/remote-branch
# 跟踪远程分支
git branch --set-upstream-to=origin/main main
```
## 6. Git 工作流程
### 6.1 Git Flow 工作流
**分支类型**
- **main/master**:生产环境代码
- **develop**:开发环境代码
- **feature/***:新功能开发
- **release/***:发布准备
- **hotfix/***:紧急修复
**流程**
```
1. 从 develop 创建 feature 分支
git checkout -b feature-login develop
2. 开发完成后合并回 develop
git checkout develop
git merge feature-login
3. 从 develop 创建 release 分支
git checkout -b release-1.0 develop
4. 测试通过后合并到 main 和 develop
git checkout main
git merge release-1.0
git checkout develop
git merge release-1.0
5. 紧急修复从 main 创建 hotfix
git checkout -b hotfix-bug main
# 修复后合并到 main 和 develop
```
### 6.2 GitHub Flow 工作流
**简化的工作流**
1. **main 分支**:始终可部署
2. **创建分支**`git checkout -b feature-login`
3. **提交并推送**`git push -u origin feature-login`
4. **创建 Pull Request**:在 GitHub 上
5. **代码审查**:团队 review
6. **合并到 main**:通过审查后合并
7. **部署**main 自动部署
## 7. 常用技巧
### 7.1 撤销操作
```bash
# 撤销工作区修改(恢复到最近一次提交)
git restore file.txt
# 或
git checkout -- file.txt
# 撤销暂存区(保留工作区修改)
git restore --staged file.txt
# 或
git reset HEAD file.txt
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1
# 撤销最后一次提交(丢弃修改)
git reset --hard HEAD~1
# 回到某个提交(危险!)
git reset --hard abc1234
# 撤销某次提交(创建新提交)
git revert abc1234
```
### 7.2 暂存工作
```bash
# 临时保存工作现场
git stash
# 查看暂存列表
git stash list
# 恢复暂存
git stash pop
# 恢复指定暂存
git stash apply stash@{1}
# 删除暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear
```
### 7.3 查看差异
```bash
# 查看工作区修改
git diff
# 查看暂存区差异
git diff --staged
# 查看两次提交的差异
git diff abc1234 def5678
# 查看某文件的修改历史
git log -p file.txt
```
### 7.4 搜索代码
```bash
# 搜索代码内容
git grep "TODO"
# 搜索提交信息
git log --grep="bug"
# 搜索添加某行代码的提交
git log -S "function_name"
```
## 8. 标签管理
### 8.1 创建标签
```bash
# 创建轻量标签
git tag v1.0.0
# 创建附注标签(推荐)
git tag -a v1.0.0 -m "版本 1.0.0"
# 给某次提交打标签
git tag -a v0.9.0 abc1234 -m "版本 0.9.0"
```
### 8.2 查看标签
```bash
# 查看所有标签
git tag
# 查看标签信息
git show v1.0.0
# 查看标签对应的提交
git log v0.9.0..v1.0.0
```
### 8.3 推送标签
```bash
# 推送单个标签
git push origin v1.0.0
# 推送所有标签
git push --tags
```
### 8.4 删除标签
```bash
# 删除本地标签
git tag -d v1.0.0
# 删除远程标签
git push origin :refs/tags/v1.0.0
# 或
git push origin --delete v1.0.0
```
## 9. Git 配置
### 9.1 基本配置
```bash
# 设置用户名
git config --global user.name "Your Name"
# 设置邮箱
git config --global user.email "your.email@example.com"
# 设置默认分支名
git config --global init.defaultBranch main
# 设置编辑器
git config --global core.editor vim
# 设置差异工具
git config --global merge.tool vscode
```
### 9.2 别名配置
```bash
# 创建常用别名
git config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.unstage 'reset HEAD --'
git config --global alias.last 'log -1 HEAD'
git config --global alias.lg "log --graph --oneline --all"
# 使用别名
git st # git status
git co main # git checkout main
git lg # 查看漂亮的提交历史
```
### 9.3 忽略文件
创建 `.gitignore` 文件:
```bash
# 忽略文件
*.log
*.tmp
.env
.DS_Store
# 忽略文件夹
node_modules/
dist/
.cache/
# 忽略特定文件
secret.txt
config.local.json
# 不忽略某文件
!important.log
```
**常见模板**
- [GitHub gitignore](https://github.com/github/gitignore)
- [gitignore.io](https://www.toptal.com/developers/gitignore)
## 10. 实战案例
### 10.1 日常开发流程
```bash
# 1. 更新本地代码
git pull origin main
# 2. 创建功能分支
git checkout -b feature-user-auth
# 3. 开发功能
# ... 编写代码 ...
# 4. 查看修改
git status
git diff
# 5. 添加文件
git add .
git status
# 6. 提交代码
git commit -m "feat: 添加用户认证功能"
# 7. 推送到远程
git push -u origin feature-user-auth
# 8. 在 GitHub 创建 Pull Request
# 9. 代码审查通过后合并
# 10. 删除本地分支
git branch -d feature-user-auth
```
### 10.2 紧急修复流程
```bash
# 1. 切换到主分支
git checkout main
# 2. 创建修复分支
git checkout -b hotfix-login-bug
# 3. 修复 bug
# ... 修改代码 ...
# 4. 提交修复
git add .
git commit -m "fix: 修复登录验证错误"
# 5. 合并到 main
git checkout main
git merge hotfix-login-bug
# 6. 打标签
git tag -a v1.0.1 -m "修复登录 bug"
# 7. 推送
git push origin main
git push origin v1.0.1
# 8. 合并到 develop(如果存在)
git checkout develop
git merge hotfix-login-bug
git push origin develop
# 9. 删除修复分支
git branch -d hotfix-login-bug
```
## 11. 最佳实践
### 11.1 提交规范
-**频繁提交**:小步快跑,容易回滚
-**清晰的提交信息**:说明做了什么和为什么
-**原子提交**:一个提交只做一件事
-**避免**:提交测试文件、临时文件
### 11.2 分支管理
-**主分支保护**:禁止直接推送到 main
-**代码审查**:所有合并通过 PR/MR
-**定期同步**:保持分支与主分支同步
-**避免**:长期存在的分支
### 11.3 协作建议
-**拉取前先提交**:避免冲突
-**解决冲突及时**:不要拖延
-**保持提交历史清晰**:使用 rebase 整理
-**写好文档**README、CHANGELOG
## 12. 常见问题
### 12.1 忘记推送某文件
```bash
# 修改最后一次提交
git add forgotten-file.txt
git commit --amend
git push -f origin feature-branch # 强制推送
```
### 12.2 提交信息写错了
```bash
# 修改最后一次提交信息
git commit --amend -m "正确的提交信息"
# 如果已推送,需要强制推送
git push -f origin branch
```
### 12.3 提交到了错误的分支
```bash
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1
# 切换到正确的分支
git checkout correct-branch
# 重新提交
git commit -m "正确的提交信息"
```
### 12.4 恢复删除的文件
```bash
# 找到删除文件的提交
git log --diff-filter=D --summary
# 恢复文件
git checkout abc1234 -- deleted-file.txt
```
## 13. 学习资源
### 13.1 官方资源
- **Git 官方文档**https://git-scm.com/doc
- **Git GitHub 指南**https://guides.github.com/
### 13.2 可视化工具
- **Git 图形化界面**
- SourceTree (免费)
- GitKraken (免费)
- GitHub Desktop (免费)
- TortoiseGit (Windows)
- **在线学习**
- Learn Git Branchinghttps://learngitbranching.js.org/
- Git Immersionhttp://gitimmersion.com/
## 14. 总结
Git 核心要点:
- 🎯 **掌握基础**add、commit、pull、push
- 🌿 **善用分支**:并行开发,互不干扰
- 📝 **规范提交**:清晰的提交信息
- 🔄 **持续同步**:保持代码最新
- 🛡️ **及时备份**:推送到远程仓库
**学习建议**
- ✅ 多动手实践:创建仓库、提交、分支
- ✅ 理解原理:Git 的三个区域、数据模型
- ✅ 查看历史:使用 git log 了解项目演进
- ✅ 解决冲突:不要害怕冲突,这是协作的常态
- ✅ 使用工具:GUI 工具可以降低学习曲线
掌握 Git,你就掌握了软件开发的基础设施。现在就开始使用 Git 管理你的代码吧!