---
name: git-commit-push
description: Git 提交和推送命令速查手册。提供暂存、提交、推送、修改提交、撤销、stash 等常用命令和场景示例。需要手动调用,使用 /git-commit-push 触发。
---

# Git 提交和推送命令速查

## 基本提交流程

### 1. 查看状态
```bash
# 查看工作区状态
git status

# 查看具体改动
git diff

# 查看已暂存的改动
git diff --cached
```

### 2. 暂存文件
```bash
# 暂存所有修改
git add .

# 暂存指定文件
git add <文件路径>

# 暂存指定目录
git add <目录路径>

# 交互式暂存(选择性暂存)
git add -p
```

### 3. 提交
```bash
# 提交并写提交信息
git commit -m "提交信息"

# 打开编辑器写详细提交信息
git commit

# 暂存并提交(跳过 git add)
git commit -am "提交信息"
```

## 推送到远程

### 基本推送
```bash
# 推送到当前分支的远程分支
git push

# 推送到指定远程仓库的指定分支
git push origin main

# 首次推送并设置上游分支
git push -u origin <分支名>

# 强制推送(谨慎使用!)
git push -f
git push --force-with-lease  # 更安全的强制推送
```

### 推送标签
```bash
# 推送指定标签
git push origin <标签名>

# 推送所有标签
git push --tags
```

## 修改提交

### 修改最后一次提交
```bash
# 修改提交信息
git commit --amend -m "新的提交信息"

# 添加遗漏的文件到最后一次提交
git add <遗漏的文件>
git commit --amend --no-edit

# 修改提交信息和内容
git commit --amend
```

### 修改后推送
```bash
# 如果已经推送过,需要强制推送
git push --force-with-lease
```

## 撤销操作

### 撤销暂存
```bash
# 撤销所有暂存
git reset HEAD

# 撤销指定文件的暂存
git reset HEAD <文件路径>

# 或使用 restore(推荐)
git restore --staged <文件路径>
```

### 撤销工作区修改
```bash
# 撤销指定文件的修改
git checkout -- <文件路径>

# 或使用 restore(推荐)
git restore <文件路径>

# 撤销所有未暂存的修改
git checkout .
```

### 撤销提交
```bash
# 撤销最后一次提交,保留修改
git reset --soft HEAD~1

# 撤销最后一次提交,取消暂存但保留修改
git reset HEAD~1

# 撤销最后一次提交,丢弃所有修改(危险!)
git reset --hard HEAD~1

# 撤销最近 N 次提交
git reset --soft HEAD~N
```

## 暂存工作进度 (Stash)

### 基本用法
```bash
# 暂存当前修改
git stash

# 暂存并添加说明
git stash save "暂存说明"

# 暂存包括未跟踪的文件
git stash -u

# 查看暂存列表
git stash list

# 恢复最近的暂存
git stash pop

# 恢复指定的暂存
git stash apply stash@{0}

# 删除暂存
git stash drop stash@{0}

# 清空所有暂存
git stash clear
```

## 查看提交历史

```bash
# 查看提交历史
git log

# 简洁的单行显示
git log --oneline

# 查看最近 N 次提交
git log -n 5

# 查看图形化分支历史
git log --graph --oneline --all

# 查看指定文件的提交历史
git log <文件路径>

# 查看指定作者的提交
git log --author="作者名"
```

## 常见场景

### 场景 1: 提交代码并推送
```bash
git add .
git commit -m "feat: 添加新功能"
git push
```

### 场景 2: 修改刚才的提交信息
```bash
git commit --amend -m "新的提交信息"
git push --force-with-lease
```

### 场景 3: 临时切换分支
```bash
# 暂存当前工作
git stash

# 切换分支处理其他事情
git checkout other-branch

# 切回来恢复工作
git checkout original-branch
git stash pop
```

### 场景 4: 提交了错误的代码,需要撤回
```bash
# 撤销提交但保留修改
git reset --soft HEAD~1

# 修改代码
# ...

# 重新提交
git add .
git commit -m "正确的提交"
```

### 场景 5: 已经推送,但需要撤回最后一次提交
```bash
# 撤销提交
git reset --hard HEAD~1

# 强制推送(谨慎!)
git push --force-with-lease
```

### 场景 6: 解决 git pull 冲突
```bash
# 查看冲突文件
git status

# 手动编辑解决冲突,或选择使用某一方的版本
git checkout --ours <文件>   # 使用本地版本
git checkout --theirs <文件>  # 使用远程版本

# 标记为已解决
git add <文件>

# 完成合并
git commit -m "解决合并冲突"

# 或者放弃本次合并
git merge --abort
```

## 提交信息规范

建议使用语义化提交信息格式:

```
<类型>(<范围>): <简短描述>

<详细描述>

<关联信息>
```

**常用类型:**
- `feat`: 新功能
- `fix`: 修复 bug
- `docs`: 文档修改
- `style`: 代码格式调整(不影响功能)
- `refactor`: 重构(既不是新功能也不是修复)
- `perf`: 性能优化
- `test`: 测试相关
- `chore`: 构建、工具或配置修改

**示例:**
```bash
git commit -m "feat(账号组): 添加批量删除功能"
git commit -m "fix(广告计划): 修复创建时的参数校验问题"
git commit -m "refactor(utils): 优化水印添加工具类"
```

## 安全建议

1. **推送前检查**: 使用 `git log` 和 `git diff` 确认要推送的内容
2. **避免强制推送**: 尽量不使用 `-f`,使用 `--force-with-lease` 更安全
3. **敏感信息**: 确保不提交密码、密钥等敏感信息
4. **提交前测试**: 确保代码可以编译和运行
5. **小步提交**: 每次提交只包含一个逻辑修改,便于回滚和审查

## 配置优化

```bash
# 设置默认编辑器
git config --global core.editor "vim"

# 设置提交模板
git config --global commit.template ~/.gitmessage

# 显示中文文件名
git config --global core.quotepath false

# 设置默认推送行为
git config --global push.default current

# 设置 pull 默认使用 merge
git config --global pull.rebase false
```
