14 KiB
14 KiB
Git 详细介绍
💡 学习指南:Git 是现代软件开发必备的版本控制工具。本章节将通过可视化演示和实战案例,带你从零掌握 Git 的核心概念、常用命令和工作流程。
0. 快速体验:Git 工作流
让我们先通过交互式演示,理解 Git 的核心概念:
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 初始化仓库
# 创建新的 Git 仓库
git init
# 克隆远程仓库
git clone https://github.com/user/repo.git
3.2 查看状态
# 查看当前状态
git status
# 查看简化状态
git status -s
输出示例:
M modified.txt # 已修改
A new.txt # 已添加
?? untracked.txt # 未跟踪
3.3 添加文件
# 添加单个文件
git add file.txt
# 添加所有文件
git add .
# 添加所有修改的文件
git add -u
# 交互式添加
git add -i
3.4 提交更改
# 提交并添加说明
git commit -m "提交信息"
# 添加并提交(跳过 git add)
git commit -am "提交信息"
# 修改最后一次提交
git commit --amend
# 查看提交历史
git log
# 查看简洁历史
git log --oneline
提交信息规范:
# 好的提交信息
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 分支命令
# 查看所有分支
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:普通合并
# 切换到主分支
git checkout main
# 合并 feature 分支
git merge feature-login
合并方式 2:变基 (Rebase)
# 将 feature 分支的提交接到 main 最新提交
git checkout feature-login
git rebase main
区别:
- merge:保留完整历史,有分叉
- rebase:线性历史,更清晰
可视化:
# Merge 结果
main: ●────●────●────●
└────● (merge commit)
feature: └────●
# Rebase 结果
main: ●────●────●────●────●
feature: └────● (moved here)
4.4 冲突解决
当合并产生冲突时:
# Git 会提示冲突
git merge feature-login
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt
解决步骤:
- 查看冲突文件:
# 标记冲突文件
git status
- 编辑文件,解决冲突:
# <<<<<<< HEAD
# 当前分支的代码
# =======
# feature 分支的代码
# >>>>>>> feature-login
# 改为你想要的代码
- 标记冲突已解决:
git add file.txt
git commit
5. 远程仓库
5.1 查看远程仓库
# 查看远程仓库
git remote
# 查看详细信息
git remote -v
# 查看远程仓库信息
git remote show origin
5.2 推送到远程
# 推送到远程仓库
git push origin main
# 推送所有分支
git push --all origin
# 推送标签
git push --tags
# 首次推送分支(设置上游)
git push -u origin feature-login
5.3 从远程拉取
# 拉取并合并
git pull origin main
# 等价于
git fetch origin main
git merge origin/main
# 仅拉取不合并
git fetch origin
5.4 远程分支
# 查看远程分支
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 工作流
简化的工作流:
- main 分支:始终可部署
- 创建分支:
git checkout -b feature-login - 提交并推送:
git push -u origin feature-login - 创建 Pull Request:在 GitHub 上
- 代码审查:团队 review
- 合并到 main:通过审查后合并
- 部署:main 自动部署
7. 常用技巧
7.1 撤销操作
# 撤销工作区修改(恢复到最近一次提交)
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 暂存工作
# 临时保存工作现场
git stash
# 查看暂存列表
git stash list
# 恢复暂存
git stash pop
# 恢复指定暂存
git stash apply stash@{1}
# 删除暂存
git stash drop stash@{0}
# 清空所有暂存
git stash clear
7.3 查看差异
# 查看工作区修改
git diff
# 查看暂存区差异
git diff --staged
# 查看两次提交的差异
git diff abc1234 def5678
# 查看某文件的修改历史
git log -p file.txt
7.4 搜索代码
# 搜索代码内容
git grep "TODO"
# 搜索提交信息
git log --grep="bug"
# 搜索添加某行代码的提交
git log -S "function_name"
8. 标签管理
8.1 创建标签
# 创建轻量标签
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 查看标签
# 查看所有标签
git tag
# 查看标签信息
git show v1.0.0
# 查看标签对应的提交
git log v0.9.0..v1.0.0
8.3 推送标签
# 推送单个标签
git push origin v1.0.0
# 推送所有标签
git push --tags
8.4 删除标签
# 删除本地标签
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 基本配置
# 设置用户名
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 别名配置
# 创建常用别名
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 文件:
# 忽略文件
*.log
*.tmp
.env
.DS_Store
# 忽略文件夹
node_modules/
dist/
.cache/
# 忽略特定文件
secret.txt
config.local.json
# 不忽略某文件
!important.log
常见模板:
10. 实战案例
10.1 日常开发流程
# 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 紧急修复流程
# 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 忘记推送某文件
# 修改最后一次提交
git add forgotten-file.txt
git commit --amend
git push -f origin feature-branch # 强制推送
12.2 提交信息写错了
# 修改最后一次提交信息
git commit --amend -m "正确的提交信息"
# 如果已推送,需要强制推送
git push -f origin branch
12.3 提交到了错误的分支
# 撤销最后一次提交(保留修改)
git reset --soft HEAD~1
# 切换到正确的分支
git checkout correct-branch
# 重新提交
git commit -m "正确的提交信息"
12.4 恢复删除的文件
# 找到删除文件的提交
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 Branching:https://learngitbranching.js.org/
- Git Immersion:http://gitimmersion.com/
14. 总结
Git 核心要点:
- 🎯 掌握基础:add、commit、pull、push
- 🌿 善用分支:并行开发,互不干扰
- 📝 规范提交:清晰的提交信息
- 🔄 持续同步:保持代码最新
- 🛡️ 及时备份:推送到远程仓库
学习建议:
- ✅ 多动手实践:创建仓库、提交、分支
- ✅ 理解原理:Git 的三个区域、数据模型
- ✅ 查看历史:使用 git log 了解项目演进
- ✅ 解决冲突:不要害怕冲突,这是协作的常态
- ✅ 使用工具:GUI 工具可以降低学习曲线
掌握 Git,你就掌握了软件开发的基础设施。现在就开始使用 Git 管理你的代码吧!