> ## Documentation Index
> Fetch the complete documentation index at: https://adonis-til.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Git 命令速查手册：从入门到日常高效操作

> Git 常用命令与 Oh My Zsh 快捷别名速查，覆盖提交、分支、远程、暂存、撤销等高频场景

> 发布于 2026-03-16 · 更新于 2026-03-16

Git 是开发者每天都在用的工具，但命令多、参数杂，记不住很正常。

这篇速查按**使用场景**分类，每个命令附带 Oh My Zsh 的 git 插件别名（括号内），让你少敲很多字。

> **前提**：你的 `.zshrc` 里需要启用 git 插件：`plugins=(... git)`

***

## 基础概念：三个区域

Git 的文件在三个区域之间流转，理解了这个，后面所有命令都好懂：

```
工作区 (Working)  →  暂存区 (Staging)  →  仓库 (Repository)
     ↑ 你改的文件           ↑ git add            ↑ git commit
```

***

## 初始化与配置

```bash theme={null}
git init                          # 初始化一个新仓库
git clone <url>                   # 克隆远程仓库（别名：gcl）
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --list                 # 查看所有配置（别名：gcf）
```

***

## SSH 密钥配置

用 HTTPS 每次推送都要输密码，配置 SSH 密钥后就能免密操作。

### 1. 检查是否已有密钥

```bash theme={null}
ls ~/.ssh
# 如果看到 xxx 和 xxx.pub 成对出现，说明已有密钥，可跳过生成步骤
```

### 2. 生成密钥

> **推荐用 Ed25519**：比传统 RSA 更安全、更快、密钥更短。GitHub 已[屏蔽旧版 RSA/SHA-1 签名](https://github.blog/security/application-security/improving-git-protocol-security-github/)。

```bash theme={null}
ssh-keygen -t ed25519 -C "你的邮箱"
```

系统会提示：

```
Enter file in which to save the key (/Users/你/.ssh/id_ed25519):
```

* **建议自定义文件名**（如 `~/.ssh/github_ed25519`），避免多个服务的密钥互相覆盖
* 密码（passphrase）可以直接回车留空，设了的话每次 push 都要输

### 3. 添加到 ssh-agent

```bash theme={null}
eval "$(ssh-agent -s)"             # 启动 agent
ssh-add ~/.ssh/github_ed25519      # 添加私钥
```

macOS 用户可以在 `~/.ssh/config` 中配置自动加载，省得每次手动添加：

```
Host github.com
  AddKeysToAgent yes
  UseKeychain yes
  IdentityFile ~/.ssh/github_ed25519
```

### 4. 添加公钥到 GitHub

```bash theme={null}
cat ~/.ssh/github_ed25519.pub      # 复制输出的内容
# macOS 可以直接：
cat ~/.ssh/github_ed25519.pub | pbcopy
```

然后去 **GitHub → Settings → SSH and GPG keys → New SSH key**，粘贴即可。

### 5. 验证连接

```bash theme={null}
ssh -T git@github.com
# 成功会显示：Hi xxx! You've been authenticated...
```

### 多账号配置

如果你有多个 GitHub 账号（比如个人 + 公司），需要在 `~/.ssh/config` 中用 Host 别名区分：

```
# 个人账号
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/personal_ed25519
  IdentitiesOnly yes

# 公司账号
Host github-work
  HostName github.com
  User git
  IdentityFile ~/.ssh/work_ed25519
  IdentitiesOnly yes
```

克隆公司仓库时把 `github.com` 换成别名：

```bash theme={null}
git clone git@github-work:company/repo.git
```

***

## 日常提交三连

最核心的操作流程：**改代码 → 暂存 → 提交**。

```bash theme={null}
git status                        # 查看当前状态（别名：gst）
git status --short                # 简洁版（别名：gss）
```

### 暂存文件

| 操作      | 命令                  | 别名     |
| ------- | ------------------- | ------ |
| 暂存指定文件  | `git add <file>`    | `ga`   |
| 暂存所有修改  | `git add --all`     | `gaa`  |
| 暂存并查看详情 | `git add --verbose` | `gav`  |
| 交互式选择暂存 | `git add --patch`   | `gapa` |

### 提交

| 操作           | 命令                                 | 别名      |
| ------------ | ---------------------------------- | ------- |
| 提交（打开编辑器写信息） | `git commit --verbose`             | `gc`    |
| 提交并附带信息      | `git commit --message "msg"`       | `gcmsg` |
| 暂存所有并提交      | `git commit --all --message "msg"` | `gcam`  |
| 修改上次提交       | `git commit --amend`               | `gc!`   |
| 修改上次提交（不改信息） | `git commit --no-edit --amend`     | `gcn!`  |

***

## 查看变更

| 操作       | 命令                     | 别名     |
| -------- | ---------------------- | ------ |
| 查看未暂存的修改 | `git diff`             | `gd`   |
| 查看已暂存的修改 | `git diff --staged`    | `gds`  |
| 按单词对比差异  | `git diff --word-diff` | `gdw`  |
| 查看与上游的差异 | `git diff @{upstream}` | `gdup` |

***

## 分支操作

分支是 Git 的核心杀手锏，随便开、随便切、合完就删。

### 查看与创建

| 操作          | 命令                                | 别名     |
| ----------- | --------------------------------- | ------ |
| 查看本地分支      | `git branch`                      | `gb`   |
| 查看所有分支（含远程） | `git branch --all`                | `gba`  |
| 查看远程分支      | `git branch --remote`             | `gbr`  |
| 创建并切换分支     | `git checkout -b <name>`          | `gcb`  |
| 切换分支（推荐新语法） | `git switch <name>`               | `gsw`  |
| 创建并切换（新语法）  | `git switch -c <name>`            | `gswc` |
| 切到主分支       | `git checkout $(git_main_branch)` | `gcm`  |

### 删除与重命名

| 操作        | 命令                            | 别名    |
| --------- | ----------------------------- | ----- |
| 删除分支（已合并） | `git branch --delete`         | `gbd` |
| 强制删除分支    | `git branch --delete --force` | `gbD` |
| 重命名分支     | `git branch --move`           | `gbm` |

***

## 远程操作

### 拉取

| 操作             | 命令                              | 别名      |
| -------------- | ------------------------------- | ------- |
| 拉取（merge 方式）   | `git pull`                      | `gl`    |
| 拉取（rebase 方式）  | `git pull --rebase`             | `gpr`   |
| 拉取并自动 stash    | `git pull --rebase --autostash` | `gpra`  |
| 从 origin 拉取主分支 | `git pull --rebase origin main` | `gprom` |

### 推送

| 操作        | 命令                                        | 别名      |
| --------- | ----------------------------------------- | ------- |
| 推送        | `git push`                                | `gp`    |
| 首次推送并设置上游 | `git push --set-upstream origin <branch>` | `gpsup` |
| 安全强推      | `git push --force-with-lease`             | `gpf`   |
| 强制推送（慎用）  | `git push --force`                        | `gpf!`  |
| 删除远程分支    | `git push origin --delete <branch>`       | `gpod`  |

### 获取

| 操作          | 命令                               | 别名    |
| ----------- | -------------------------------- | ----- |
| 获取远程更新      | `git fetch`                      | `gf`  |
| 获取所有远程 + 清理 | `git fetch --all --tags --prune` | `gfa` |
| 获取 origin   | `git fetch origin`               | `gfo` |

***

## 合并与变基

| 操作      | 命令                              | 别名     |
| ------- | ------------------------------- | ------ |
| 合并分支    | `git merge`                     | `gm`   |
| 仅快进合并   | `git merge --ff-only`           | `gmff` |
| 合并远程主分支 | `git merge origin/main`         | `gmom` |
| 中止合并    | `git merge --abort`             | `gma`  |
| 变基到主分支  | `git rebase $(git_main_branch)` | `grbm` |
| 交互式变基   | `git rebase --interactive`      | `grbi` |
| 中止变基    | `git rebase --abort`            | `grba` |
| 继续变基    | `git rebase --continue`         | `grbc` |

***

## 暂存工作（Stash）

手头写了一半要切分支？stash 帮你把改动暂时藏起来。

| 操作         | 命令                              | 别名       |
| ---------- | ------------------------------- | -------- |
| 暂存（含未跟踪文件） | `git stash --include-untracked` | `gstu`   |
| 暂存所有       | `git stash --all`               | `gstall` |
| 恢复最近一次暂存   | `git stash pop`                 | `gstp`   |
| 恢复但不删除     | `git stash apply`               | `gstaa`  |
| 查看暂存列表     | `git stash list`                | `gstl`   |
| 查看暂存内容     | `git stash show --patch`        | `gsts`   |
| 删除最近一次暂存   | `git stash drop`                | `gstd`   |
| 清空所有暂存     | `git stash clear`               | `gstc`   |

***

## 撤销与回退

这是最容易搞混的部分。记住一个原则：**先确认影响范围，再操作**。

### 撤销暂存

```bash theme={null}
git restore --staged <file>       # 把文件从暂存区移回工作区（别名：grst）
git reset -- <file>               # 同上，旧语法（别名：gru）
```

### 撤销修改

```bash theme={null}
git restore <file>                # 丢弃工作区修改，恢复到暂存区版本（别名：grs）
git checkout -- <file>            # 同上，旧语法
```

### 回退提交

| 操作             | 命令                        | 别名     |
| -------------- | ------------------------- | ------ |
| 软回退（保留修改在暂存区）  | `git reset --soft HEAD~1` | `grhs` |
| 混合回退（保留修改在工作区） | `git reset HEAD~1`        | `grh`  |
| 硬回退（丢弃所有修改）    | `git reset --hard HEAD~1` | `grhh` |
| 创建一个反向提交       | `git revert <commit>`     | `grev` |

> **安全提示**：`reset --hard` 会丢失未提交的修改，用前三思。优先用 `revert` 来安全地撤销已推送的提交。

***

## 查看历史

| 操作           | 命令                                           | 别名      |
| ------------ | -------------------------------------------- | ------- |
| 单行日志         | `git log --oneline --decorate`               | `glo`   |
| 图形化日志        | `git log --oneline --decorate --graph`       | `glog`  |
| 图形化 + 所有分支   | `git log --oneline --decorate --graph --all` | `gloga` |
| 带文件变更统计      | `git log --stat`                             | `glg`   |
| 漂亮格式 + 时间    | `git log --graph --pretty=...`               | `glol`  |
| 查看某次提交       | `git show <commit>`                          | `gsh`   |
| 查看谁写的（blame） | `git blame -w <file>`                        | `gbl`   |

***

## 标签

| 操作          | 命令                        | 别名     |
| ----------- | ------------------------- | ------ |
| 创建带注释的标签    | `git tag --annotate`      | `gta`  |
| 列出标签（按版本排序） | `git tag \| sort -V`      | `gtv`  |
| 查看最新标签      | `git describe --tags ...` | `gdct` |

***

## WIP 快捷流程

Oh My Zsh 提供了一套"半成品保存"流程，切分支前用 `gwip`，回来用 `gunwip`：

```bash theme={null}
gwip       # 暂存所有 + 创建一个 --wip-- 提交（不触发 hooks）
gunwip     # 撤销最近一个 --wip-- 提交，恢复到修改状态
```

***

## 我的高频操作 Top 10

| #  | 场景      | 快速输入                  |
| -- | ------- | --------------------- |
| 1  | 查看状态    | `gst`                 |
| 2  | 暂存所有并提交 | `gcam "feat: 新功能"`    |
| 3  | 拉取最新代码  | `gprom`               |
| 4  | 创建新分支   | `gcb feature/xxx`     |
| 5  | 切回主分支   | `gcm`                 |
| 6  | 推送并设上游  | `gpsup`               |
| 7  | 查看图形日志  | `glog`                |
| 8  | 暂存改动切分支 | `gstu` → 切分支 → `gstp` |
| 9  | 查看文件差异  | `gd`                  |
| 10 | 修改上次提交  | `gc!`                 |

***

## 参考资源

* [Oh My Zsh Git Plugin 完整别名表](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/git)
* [Git 官方文档](https://git-scm.com/doc)
* [Git Cheat Sheet (GitHub Education)](https://education.github.com/git-cheat-sheet-education.pdf)
* [Learn Git Branching 交互式教程](https://learngitbranching.js.org/?locale=zh_CN)
