feat: save current work to dev branch
This commit is contained in:
@@ -0,0 +1,755 @@
|
||||
# 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 Branching:https://learngitbranching.js.org/
|
||||
- Git Immersion:http://gitimmersion.com/
|
||||
|
||||
## 14. 总结
|
||||
|
||||
Git 核心要点:
|
||||
|
||||
- 🎯 **掌握基础**:add、commit、pull、push
|
||||
- 🌿 **善用分支**:并行开发,互不干扰
|
||||
- 📝 **规范提交**:清晰的提交信息
|
||||
- 🔄 **持续同步**:保持代码最新
|
||||
- 🛡️ **及时备份**:推送到远程仓库
|
||||
|
||||
**学习建议**:
|
||||
- ✅ 多动手实践:创建仓库、提交、分支
|
||||
- ✅ 理解原理:Git 的三个区域、数据模型
|
||||
- ✅ 查看历史:使用 git log 了解项目演进
|
||||
- ✅ 解决冲突:不要害怕冲突,这是协作的常态
|
||||
- ✅ 使用工具:GUI 工具可以降低学习曲线
|
||||
|
||||
掌握 Git,你就掌握了软件开发的基础设施。现在就开始使用 Git 管理你的代码吧!
|
||||
Reference in New Issue
Block a user