Git 命令速查表
Git 常用命令速查:clone、add、commit、branch、merge、rebase、stash 等高频命令对照,附中文说明,日常版本控制时快速查阅。
原理解析
Git 是分布式版本控制系统:每个开发者的仓库都含完整历史,无需中心服务器也能提交。工作区、暂存区(index)、本地仓库三层结构,是理解所有命令的钥匙——改动要先 add 进暂存区,再 commit 进仓库。
commit 不是 diff 而是快照,由父指针串成 DAG;branch 只是指向某个 commit 的轻量指针,所以创建/切换分支极快。merge 保留分叉历史、rebase 把提交重放到目标分支之上以得到线性历史,二者语义不同。
什么时候该查这张表
这张表在你要查「某个 Git 子命令该怎么写」时有用,尤其是那些不天天用、参数记不清的子命令(rebase、cherry-pick、reflog、bisect 一类)。它的价值是覆盖面:提交、分支、远程、撤销、诊断五类分组,找命令很快。
不该查的情况:你在学 Git 的工作原理或设计分支策略。「为什么 rebase 会变基」「cherry-pick 与 merge 的取舍」这类问题不在命令表范围内,命令表只告诉你怎么敲,不解释为什么这么设计。
判断标准:命令是用来改变仓库状态还是只读查看。只读类(log、status、diff、show、blame)可以放心执行;改变类(reset、rebase、clean、filter-branch)在你没完全理解后果前不要敲,尤其带 --hard / -f 的。
特别注意版本差异:git checkout 既能切分支也能恢复文件,git restore 是 2.23 才引入的;git switch 是 2.23 引入的。老版本环境里没有 switch/restore,写脚本时要用检测或降级写法。
边界与常见陷阱
reset --hard 会丢弃未提交的工作区改动
这是最常见的误操作之一。「git reset --hard HEAD~3」 会把工作区和暂存区一起回退到目标提交,未提交的改动直接消失且无法恢复(未 push 的内容 Git 不会替你备份)。安全做法:先 「git stash」 或 「git diff > patch」 存档,或者改用 「git reset --soft」(只动 HEAD,保留改动在暂存区)。
rebase 会改写历史,不要对已推送的提交使用
rebase 的本质是「把改动复制到新基底上」,原提交被丢弃产生新 SHA。这对已推送到共享分支的提交是危险的:你的历史与别人的历史分叉,pull 时产生难以收拾的冲突与重复提交。规则:只 rebase 自己的、未推送的分支;已推送的用 git push --force-with-lease「 替代裸 」--force(前者会在远端有新提交时拒绝推送)。
git config 作用域分三级,含义完全不同
同一项配置可能同时存在于系统级(--system,通常是 /etc/gitconfig)、全局级(--global,~/.gitconfig)、仓库级(--local,.git/config),后者覆盖前者。排查「设置为什么不生效」时要逐级查:git config --list --show-origin 能同时打出每个键的值与来源文件。CI 容器里通常只有系统级和仓库级,没有全局级 —— 这就是「本地好好的、CI 里 core.autocrlf 变 true」这类问题的根源。
reflog 是找回「丢失提交」的唯一可靠途径
误 reset、误 rebase、误切分支导致「提交不见了」时,reflog 记录了 HEAD 的移动轨迹(通常保留 90 天),里面还能找到原 SHA。用 「git reflog」 查看,再用 「git reset --hard <sha>」 或 「git cherry-pick <sha>」 恢复。注意:reflog 是本地记录,未提交过的改动它也救不回来,且 clone 别人的仓库时不包含你的 reflog。
与相邻内容的分工
要查某个子命令的完整参数与官方语义,以 git <cmd> --help 与 git 官方文档为准,本表是常用集合的速查。
要把分支状态画成图、或理解 merge/rebase 的历史差异,用站内 Git 图示类工具;本表只提供命令文本。
涉及 CI 环境下的 Git 行为差异(凭证、换行符、浅克隆),属于 CI 配置问题,不在本表范围。
若目的是把历史整理干净再推送,涉及交互式 rebase 的取舍与风险评估,需要的是方案设计而非命令查询。
实战片段
要点:① 改写类操作前先 git diff 存档 + 打 backup 分支,reflog 只能救回「提交过」的内容;② reset 默认用 --soft,--hard 会丢未提交改动且不可恢复;③ rebase 只对未推送的自己的分支做,已推送的强推用 --force-with-lease 而非 --force;④ 排「配置不生效」用 git config --list --show-origin,一次性看清每个键的值与来源文件。
# ① 动手前先看清现状(只读,安全)
git status --short # 工作区有哪些改动
git log --oneline -10 # 最近提交
git diff --stat # 改动规模
git config --list --show-origin # 配置来自哪个文件(排设置问题用)
# ② 改写/回退前先存档(这三步能救回绝大多数误操作)
git diff > /tmp/backup.patch # 未暂存的改动
git diff --cached > /tmp/idx.patch # 已暂存的改动
git branch backup-before-reset # 给当前 HEAD 打个标签分支
# ③ 优先用 --soft,别默认 --hard
git reset --soft HEAD~3 # 只动 HEAD,改动留在暂存区(安全)
# git reset --hard HEAD~3 # 工作区+暂存区一起丢 —— 除非确定,否则别用
# ④ 误操作后从 reflog 找回
git reflog # 找到目标 SHA
git reset --hard <sha> # 或 git cherry-pick <sha>
# ⑤ rebase 只对自己的未推送分支;强推用 --force-with-lease
git rebase -i origin/main # 先 fetch,确认没落后
git push --force-with-lease实践注解
- reset --hard 会丢弃未提交改动且不可恢复它把工作区与索引强制对齐到目标提交,未提交内容不会进 reflog。要临时撤回提交但保留改动,用 --soft(保留在暂存区)或 --mixed(默认,保留在工作区)。
- rebase 会重写提交哈希,已推送分支上慎用在共享分支上 rebase 后强推,其他人的本地历史会与远端分叉。团队协作的通用规则是:只 rebase 自己尚未推送的提交。
- git checkout 一个文件会覆盖工作区改动这个文件级回退不会进 reflog,误操作即丢失。多轮叠加改动时尤其危险——它会把同一文件上更早的、你想保留的改动一并抹掉;应先用 git diff 看准再局部还原。
数据来源
- Git reference manual (git-scm.com/docs)
- Pro Git, 2nd edition
上述编号、名称与定义均来自公开规范,本站不主张对规范数据本身的独创性;本页的编排方式、中文释义与实践注解由本站撰写。
| 命令 | 说明 |
|---|---|
| git init | 初始化一个新的仓库 |
| git clone | 克隆远程仓库到本地 |
| git config | 配置用户名/邮箱等 |
| git status | 查看工作区状态 |
| git add | 暂存改动(-A 全部) |
| git commit | 提交暂存区改动(-m 信息) |
| git push | 推送提交到远程 |
| git pull | 拉取并合并远程改动 |
| git fetch | 仅获取远程更新不合并 |
| git branch | 列出/创建分支 |
| git checkout | 切换分支或恢复文件 |
| git switch | 切换分支(更语义化) |
| git merge | 合并指定分支到当前 |
| git rebase | 将提交变基到另一分支 |
| git stash | 暂存未完成的改动 |
| git log | 查看提交历史(--oneline) |
| git diff | 查看改动差异 |
| git reset | 重置到某次提交(--soft/--hard) |
| git revert | 用新提交撤销某次改动 |
| git cherry-pick | 拣选某个提交到当前分支 |
| git tag | 打标签(版本标记) |
| git remote | 管理远程仓库(-v 查看) |
| git clean | 删除未跟踪文件(-fd 强制) |
| git rm | 停止跟踪并删除文件 |
| git show | 查看某次提交/对象详情 |
常见问题
merge 和 rebase 有什么区别?
merge 会生成一个合并提交,保留分支分叉的完整历史;rebase 把当前分支的提交"重放"到目标分支之上,得到线性历史,但会改写已有提交的哈希,不要对已推送的共享分支 rebase。
如何撤销最后一次提交?
想保留改动用 git reset --soft HEAD~1;想彻底丢弃用 git reset --hard HEAD~1;更安全的做法是 git revert HEAD 生成一个撤销提交。
如何临时保存未完成的改动?
用 git stash 把工作区改动藏起来,git stash pop 恢复。可多次 stash,用 git stash list 查看。
如何把某个文件从暂存区撤回?
用 git reset HEAD <file> 取消暂存(改动仍保留在工作区);若想同时丢弃改动则用 git checkout -- <file>(或 git restore <file>)。