notes/git-guide.md
2025-06-25 22:16:26 +08:00

240 lines
4.8 KiB
Markdown

# Git 使用指南
## 基础概念
Git 是一个分布式版本控制系统,用于跟踪代码变更历史。
### 核心概念
- **仓库 (Repository)**: 存储项目所有文件和历史记录的地方
- **工作区 (Working Directory)**: 当前正在编辑的文件
- **暂存区 (Staging Area)**: 准备提交的文件暂存地
- **提交 (Commit)**: 保存项目快照的操作
## 基础配置
```bash
# 配置用户信息
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
# 查看配置
git config --list
```
## 常用命令
### 初始化和克隆
```bash
# 初始化新仓库
git init
# 克隆远程仓库
git clone <仓库地址>
```
### 文件操作
```bash
# 查看状态
git status
# 添加文件到暂存区
git add <文件名> # 添加单个文件
git add . # 添加所有文件
git add -A # 添加所有变更(包括删除)
# 提交变更
git commit -m "提交信息"
# 查看变更差异
git diff # 工作区与暂存区的差异
git diff --staged # 暂存区与最后提交的差异
```
### 历史查看
```bash
# 查看提交历史
git log
git log --oneline # 简洁格式
git log --graph # 图形化显示
# 查看文件变更历史
git log -p <文件名>
```
### 分支操作
```bash
# 查看分支
git branch # 本地分支
git branch -r # 远程分支
git branch -a # 所有分支
# 创建分支
git branch <分支名>
# 切换分支
git checkout <分支名>
git switch <分支名> # Git 2.23+ 新命令
# 创建并切换分支
git checkout -b <分支名>
git switch -c <分支名>
# 删除分支
git branch -d <分支名> # 安全删除
git branch -D <分支名> # 强制删除
```
### 合并操作
```bash
# 合并分支
git merge <分支名>
# 变基操作
git rebase <分支名>
```
### 远程仓库
```bash
# 查看远程仓库
git remote -v
# 添加远程仓库
git remote add origin <仓库地址>
# 推送到远程
git push origin <分支名>
git push -u origin <分支名> # 首次推送并设置上游
# 拉取远程变更
git pull origin <分支名>
git fetch origin # 只获取不合并
```
### 撤销操作
```bash
# 撤销工作区变更
git checkout -- <文件名>
git restore <文件名> # Git 2.23+ 新命令
# 撤销暂存区变更
git reset HEAD <文件名>
git restore --staged <文件名>
# 撤销提交
git reset --soft HEAD~1 # 保留变更在暂存区
git reset --mixed HEAD~1 # 保留变更在工作区
git reset --hard HEAD~1 # 完全撤销变更
# 创建反向提交
git revert <提交ID>
```
## 进阶技巧
### 标签管理
```bash
# 创建标签
git tag <标签名>
git tag -a <标签名> -m "标签说明"
# 查看标签
git tag
# 推送标签
git push origin <标签名>
git push origin --tags
```
### 暂存变更
```bash
# 暂存当前变更
git stash
# 查看暂存列表
git stash list
# 应用暂存变更
git stash apply # 应用最新暂存
git stash pop # 应用并删除最新暂存
git stash apply stash@{n} # 应用指定暂存
# 删除暂存
git stash drop
git stash clear # 清空所有暂存
```
### 重写历史
```bash
# 交互式变基
git rebase -i HEAD~n # 修改最近n个提交
# 修改最后一次提交
git commit --amend
# 压缩提交
git rebase -i HEAD~n # 使用squash命令
```
## 工作流程建议
### 基本工作流
1. `git status` - 检查当前状态
2. `git add` - 添加变更到暂存区
3. `git commit` - 提交变更
4. `git push` - 推送到远程仓库
### 功能开发流程
1. `git checkout -b feature/新功能` - 创建功能分支
2. 开发和提交变更
3. `git checkout main` - 切换到主分支
4. `git merge feature/新功能` - 合并功能分支
5. `git branch -d feature/新功能` - 删除功能分支
## 最佳实践
1. **频繁提交**: 小步快跑,经常提交变更
2. **清晰的提交信息**: 使用描述性的提交信息
3. **使用分支**: 为每个功能或修复创建分支
4. **保持主分支稳定**: 不要直接在主分支上开发
5. **定期同步**: 经常拉取远程变更
6. **审查变更**: 提交前检查变更内容
## 常见问题解决
### 合并冲突
```bash
# 查看冲突文件
git status
# 手动解决冲突后
git add <冲突文件>
git commit
```
### 忘记切换分支
```bash
# 将变更移到新分支
git stash
git checkout -b <新分支>
git stash pop
```
### 误删文件
```bash
# 恢复已删除的文件
git checkout HEAD -- <文件名>
```
## 有用的别名配置
```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.visual '!gitk'
```
这样就可以使用 `git st` 代替 `git status` 等。