Git 命令速查
常用 Git 命令场景化速查:撤销、回滚、分支、变基、储藏、子模块等分类检索,一键复制即贴即用。
| 场景 | COMMAND | 说明 | |
|---|---|---|---|
| 配置 | git config --global user.name "Name" | 设置全局提交者姓名 | |
| 配置 | git config --global user.email "you@example.com" | 设置全局提交者邮箱 | |
| 配置 | git config --global init.defaultBranch main | 新仓库默认分支改为 main | |
| 配置 | git config --global core.autocrlf input | 提交转 LF、检出不动(跨平台行尾) | |
| 配置 | git config --global alias.st "status -sb" | 配置别名(git st) | |
| 配置 | git config --list --show-origin | 查看全部配置及其来源文件 | |
| 开始 | git init | 在当前目录初始化仓库 | |
| 开始 | git clone <url> --depth 1 | 浅克隆(只取最近一次提交,大仓库快) | |
| 开始 | git clone -b <branch> <url> | 克隆并直接检出指定分支 | |
| 开始 | git status -sb | 精简状态(分支 + 变更列表) | |
| 开始 | git switch -c <new-branch> | 创建并切换到新分支(现代写法) | |
| 日常提交 | git add -p | 逐块暂存(拆分提交的好帮手) | |
| 日常提交 | git commit --amend --no-edit | 把改动并入上一次提交(未推送时) | |
| 日常提交 | git commit -m "feat: message" | 带约定的提交信息(Conventional Commits) | |
| 日常提交 | git restore <file> | 丢弃工作区改动(危险:不可恢复) | |
| 日常提交 | git restore --staged <file> | 把文件移出暂存区(保留改动) | |
| 日常提交 | git diff --staged | 查看已暂存但未提交的差异 | |
| 日常提交 | git clean -fd | 删除未跟踪的文件与目录(危险) | |
| 日常提交 | git rm --cached <file> | 停止跟踪但保留本地文件(如误提交的 .env) | |
| 分支 | git branch -a | 列出本地与远程全部分支 | |
| 分支 | git branch -m old new | 重命名分支 | |
| 分支 | git branch -d <branch> | 删除已合并分支(-D 强制) | |
| 分支 | git switch <branch> | 切换分支(现代写法) | |
| 分支 | git worktree add ../hotfix hotfix | 工作树:并行检出另一分支到独立目录 | |
| 分支 | git cherry-pick <sha> | 摘取单个提交到当前分支 | |
| 合并 / 变基 | git merge --no-ff <branch> | 合并并保留合并节点 | |
| 合并 / 变基 | git merge --abort | 放弃本次合并,回到合并前状态 | |
| 合并 / 变基 | git rebase main | 把当前分支变基到 main(线性历史) | |
| 合并 / 变基 | git rebase --continue | 解决冲突后继续变基 | |
| 合并 / 变基 | git rebase -i HEAD~3 | 交互式变基:改序/合并/改写最近 3 个提交 | |
| 合并 / 变基 | git rebase --onto main <sha> | 把一段提交整体搬到另一基底上 | |
| 撤销 / 回滚 | git commit --amend | 修正最后一次提交(信息或内容) | |
| 撤销 / 回滚 | git reset --soft HEAD~1 | 撤销提交、保留改动在暂存区 | |
| 撤销 / 回滚 | git reset --hard HEAD~1 | 撤销提交并丢弃改动(危险:不可恢复) | |
| 撤销 / 回滚 | git revert <sha> | 生成反向提交安全回滚(公共分支用这个) | |
| 撤销 / 回滚 | git reflog | 查看 HEAD 移动历史(找回"消失"的提交) | |
| 撤销 / 回滚 | git reset --hard <sha> | 整个分支硬回位到某次提交(危险) | |
| 撤销 / 回滚 | git checkout <sha> -- <file> | 从历史提交恢复单个文件 | |
| 远程 | git remote -v | 查看远程仓库地址 | |
| 远程 | git remote set-url origin <url> | 更换远程地址(换协议/搬家) | |
| 远程 | git fetch --prune | 拉取远程更新并清理已删除的远程分支引用 | |
| 远程 | git push -u origin <branch> | 首次推送并建立跟踪关系 | |
| 远程 | git push --force-with-lease | 安全强推(远程被别人动过会拒绝) | |
| 远程 | git push origin --delete <branch> | 删除远程分支 | |
| 远程 | git pull --rebase | 以变基方式拉取(避免无谓合并节点) | |
| 储藏 | git stash push -m "wip: msg" | 带说明地储藏当前改动 | |
| 储藏 | git stash list | 查看储藏列表 | |
| 储藏 | git stash pop | 恢复最近一次储藏并删除该记录 | |
| 储藏 | git stash apply stash@{2} | 恢复指定储藏但保留记录 | |
| 储藏 | git stash -u | 储藏时包含未跟踪文件 | |
| 标签 | git tag -a v1.2.0 -m "release" | 创建附注标签(发版用) | |
| 标签 | git push origin v1.2.0 | 推送单个标签(push 默认不带标签) | |
| 标签 | git tag -d v1.2.0 | 删除本地标签 | |
| 标签 | git tag --sort=-creatordate | 按时间倒序列出标签 | |
| 子模块 | git submodule add <url> <path> | 添加子模块 | |
| 子模块 | git submodule update --init --recursive | 克隆后初始化全部子模块 | |
| 子模块 | git submodule update --remote | 把子模块更新到其上游最新 | |
| 子模块 | git clone --recurse-submodules <url> | 克隆时一并拉取子模块 | |
| 查看历史 | git log --oneline --graph --all -20 | 图形化总览最近提交 | |
| 查看历史 | git log -p <file> | 查看单文件的逐次改动 | |
| 查看历史 | git log --author="Name" --since="2 weeks ago" | 按作者与时间过滤历史 | |
| 查看历史 | git blame -L 10,20 <file> | 逐行问责:10–20 行是谁改的 | |
| 查看历史 | git show <sha> | 查看某次提交的完整改动 | |
| 查看历史 | git shortlog -sn | 按提交数统计贡献者 | |
| 疑难杂症 | git fsck --lost-found | 检查悬空对象(配合 reflog 找回数据) | |
| 疑难杂症 | git diff main...feature | 三点差异:从分叉点看 feature 的改动 | |
| 疑难杂症 | git bisect start | 二分定位引入 bug 的提交 | |
| 疑难杂症 | git update-index --assume-unchanged <file> | 临时忽略本地改动(本地配置类文件) | |
| 疑难杂症 | git ls-files | xargs rm && git checkout . | 工作区完全恢复到 HEAD(最后手段) |
>_ 使用指南 · GUIDE
Git 的命令你天天用,但「撤销昨天的提交」「把一段提交搬到别的基底」「找回消失的 commit」这些低频操作每次都要现查。这份速查按场景组织:配置、开始、日常提交、分支、合并/变基、撤销/回滚、远程、储藏、标签、子模块、历史与疑难杂症,支持关键词 + 场景双重过滤,每条命令一键复制。
典型步骤:
- 按场景浏览:点场景标签聚焦一类操作,如排查回滚问题时切到「撤销 / 回滚」
- 关键词搜索:搜
reset、撤销、force直接命中相关命令 - 复制即用:点行尾复制按钮,贴进终端稍改参数就能跑
- 留意危险标记:说明里标「不可恢复」的命令(reset --hard、clean -fd 等)执行前务必确认
>_ 常见问题 · FAQ
Q1 · git reset 和 git revert 怎么选?
revert 生成一个「反向提交」来抵消目标提交,历史只增不改,公共分支一律用它;reset 是把分支指针直接搬走,本地未推送的整理用它没问题,推过之后 reset + 强推会让协作者的历史错乱。一句话:改自己的历史用 reset,改公共历史用 revert。
Q2 · commit 信息写错了怎么改?
尚未推送:git commit --amend 直接改写最后一次提交(想保留原信息加 --no-edit)。已推送:amend 后需要强推,公共分支请评估改用一次说明性的 revert + 新提交。更早的提交用交互式变基 git rebase -i 把目标行改为 reword。
Q3 · git push --force 和 --force-with-lease 差在哪?
--force 无条件覆盖远程;--force-with-lease 先校验远程仍停在你本地上次见到的位置,若有人在你之后推送过则拒绝。几乎任何时候都该用后者——它只在「远程没有别人的新提交」时才允许覆盖。
Q4 · 提交不见了怎么找回?
分支指针动过但提交对象还在:git reflog 列出 HEAD 的移动历史,找到目标提交的 sha,git reset --hard <sha> 或建新分支指过去即可。reflog 默认保留约 90 天,配合 git fsck --lost-found 能救回绝大多数「事故现场」。
Q5 · 误把密钥提交进仓库怎么办?
先 git rm --cached <file> 停止跟踪并加入 .gitignore;但历史里仍有痕迹——私有仓库可考虑用 git filter-repo 清洗历史后强推,公开仓库或已泄露的密钥直接作废轮换,清洗历史不等于撤销泄露。