240 lines
4.8 KiB
Markdown
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` 等。 |