理 理悟万池
`⌘K`

全部工具

CHEATSHEET · GIT

# Git 命令行 Cheatsheet

以「问题 → 解决」为导向：撤销提交、找回误删分支、解决合并冲突、二分定位 bug、安全强推。中文意图直接搜。

命令 | 说明 | 分类 |
--- | --- | --- | ---
git init | 在当前目录创建仓库 | 基础 |
git clone <url> | 克隆远端仓库 | 基础 |
git clone --depth 1 <url> | 浅克隆只取最新提交（CI 加速） | 基础 |
git add -A | 把所有变化（含删除）加入暂存区 | 基础 |
git add -p | 逐 hunk 选择性 stage（精细化提交） | 基础 |
git commit -m "msg" | 提交 | 基础 |
git commit -am "msg" | 已跟踪文件 stage + commit 一步搞定 | 基础 |
git status -sb | 简洁的状态 + 分支信息 | 查看状态 |
git status --ignored | 同时显示被忽略的文件 | 查看状态 |
git ls-files | 列出所有跟踪文件 | 查看状态 |
git check-ignore -v <path> | 查 path 被哪条 ignore 规则忽略 | 查看状态 |
git remote -v | 看所有远端 URL | 查看状态 |
git log --oneline --graph --all --decorate | 图形化彩色历史（最常用） | 历史 |
git log -p -- <file> | 看某文件的提交差异历史 | 历史 |
git log -S "needle" -- <path> | pickaxe：找哪次提交引入或删除了某代码片段 | 历史 |
git log -G "regex" -- <path> | pickaxe + 正则版本 | 历史 |
git log --author="Tao" --since="2 weeks ago" | 某作者近期提交 | 历史 |
git log --follow -- <file> | 跨重命名跟踪文件历史 | 历史 |
git log master..feat/x | feat/x 比 master 多的提交 | 历史 |
git shortlog -sne | 按作者统计提交数 | 历史 |
git blame -L 50,80 -- file | 看 file 第 50–80 行的责任人/提交 | 历史 |
git show <hash> | 看某次提交的完整变更 | 历史 |
git show <hash>:path/to/file | 看某次提交里某文件内容 | 历史 |
git diff | 工作区 vs 暂存区 | 差异 |
git diff --staged | 暂存区 vs HEAD | 差异 |
git diff main...feat/x | 从分叉点开始 feat/x 的变更 | 差异 |
git diff --stat | 只看每个文件的增删行数 | 差异 |
git diff --name-only | 只看变更文件名 | 差异 |
git diff -w | 忽略空白差异 | 差异 |
git range-diff main..@{u} main..HEAD | 比较两组 commit 序列（rebase 前后对比） | 差异 |
git branch -a | 看所有本地 + 远端分支 | 分支 |
git branch -vv | 看本地分支与上游跟踪 | 分支 |
git switch -c feat/x | 新建并切换分支（推荐替代 checkout -b） | 分支 |
git switch - | 切回上一个分支 | 分支 |
git branch -d feat/x | 删除已合并的本地分支 | 分支 |
git branch -D feat/x ⚠ 可通过 reflog 找回 | 强制删除（未合并也删） | 分支 |
git branch -m new-name | 重命名当前分支 | 分支 |
git push origin --delete feat/x | 删除远端分支 | 分支 |
git branch --set-upstream-to=origin/feat/x | 为当前分支设置上游跟踪 | 分支 |
git branch --merged main | 看哪些分支已合入 main（可批量清理） | 分支 |
git merge feat/x | 把 feat/x 合并进当前分支 | 合并/变基 |
git merge --no-ff feat/x | 保留分支拓扑的合并 | 合并/变基 |
git merge --squash feat/x && git commit | 把 feat/x 全部变更压成一条提交 | 合并/变基 |
git rebase main | 把当前分支变基到 main | 合并/变基 |
git rebase -i HEAD~5 | 交互式整理最近 5 次提交（pick/squash/reword） | 合并/变基 |
git rebase --onto target upstream branch | 把 branch 从 upstream 之后的提交搬到 target 上 | 合并/变基 |
git rebase --continue / --skip / --abort | rebase 中流程控制 | 合并/变基 |
git pull --rebase | 拉取并变基（避免无意义 merge commit） | 合并/变基 |
git config --global pull.rebase true | 永久设置 pull 默认 rebase | 合并/变基 |
git cherry-pick <hash> | 把某提交挑到当前分支 | 合并/变基 |
git cherry-pick A^..B | 挑一段连续提交（含 A） | 合并/变基 |
git cherry-pick --abort | 终止 cherry-pick | 合并/变基 |
git stash push -u -m "WIP" | 暂存（含未跟踪文件） | 暂存 |
git stash list | 看 stash 列表 | 暂存 |
git stash show -p stash@{0} | 看 stash 内容 | 暂存 |
git stash pop | 恢复并删除最新 stash | 暂存 |
git stash apply stash@{2} | 应用某个 stash 但不删除 | 暂存 |
git stash drop stash@{0} | 删除某个 stash | 暂存 |
git stash branch hotfix stash@{0} | 基于 stash 创建新分支恢复 | 暂存 |
git restore <file> | 丢弃工作区改动 | 撤销/恢复 |
git restore --staged <file> | 取消暂存（保留工作区改动） | 撤销/恢复 |
git restore --source=HEAD~2 -- <file> | 把文件恢复到 HEAD~2 时的版本 | 撤销/恢复 |
git commit --amend | 修改最近一次提交（消息或追加内容） | 撤销/恢复 |
git commit --amend --no-edit | 把暂存内容追加到上次提交（不改 message） | 撤销/恢复 |
git reset --soft HEAD~1 | 撤销最近一次提交，改动留在暂存区 | 撤销/恢复 |
git reset --mixed HEAD~1 | 撤销提交，改动留在工作区（默认） | 撤销/恢复 |
git reset --hard HEAD~1 ⚠ 会丢工作区改动；可用 reflog 找回提交 | 彻底回退到上一提交 | 撤销/恢复 |
git revert <hash> | 生成反向提交（公共历史首选） | 撤销/恢复 |
git revert -m 1 <merge-hash> | 回滚一个 merge 提交 | 撤销/恢复 |
git clean -fd ⚠ 不可恢复，先 git clean -nfd 预览 | 删除未跟踪文件和目录 | 撤销/恢复 |
git clean -nfd | 预览将被清理的未跟踪文件 | 撤销/恢复 |
git fetch --all --prune | 同步所有远端并清理已删除的远端分支 | 远端 |
git push -u origin feat/x | 首次推送并设置上游 | 远端 |
git push --force-with-lease ⚠ 比 --force 安全；仍需谨慎 | 安全的强推（基于上次拉取的远端引用） | 远端 |
git remote add upstream <url> | 添加 upstream 远端（fork 协作） | 远端 |
git remote set-url origin <url> | 修改 origin 的 URL | 远端 |
git remote rename origin upstream | 重命名远端 | 远端 |
git push origin --tags | 推送所有标签 | 远端 |
git fetch origin pull/123/head:pr-123 | 把 GitHub PR 拉到本地分支审阅 | 远端 |
git tag v1.2.0 | 打轻量标签 | 标签 |
git tag -a v1.2.0 -m "release" | 打 annotated 标签（推荐） | 标签 |
git tag -d v1.2.0 | 删除本地标签 | 标签 |
git push origin :refs/tags/v1.2.0 | 删除远端标签 | 标签 |
git describe --tags --always | 基于最近 tag 生成版本号（CI 常用） | 标签 |
git status | 看哪些文件有冲突标记 UU | 冲突 |
git diff --name-only --diff-filter=U | 只列出冲突文件 | 冲突 |
git checkout --ours <file> | 冲突时保留当前分支版本 | 冲突 |
git checkout --theirs <file> | 冲突时保留对方版本 | 冲突 |
git mergetool | 调用配置好的可视化合并工具 | 冲突 |
git merge --abort / git rebase --abort | 放弃本次合并/变基 | 冲突 |
git rerere | 让 git 记住冲突解决方案，下次自动套用 | 冲突 |
git reflog | 看所有 HEAD 移动记录（误删/误 reset 的救命稻草） | 问题恢复 |
git reset --hard <reflog-hash> | 把分支强制回到某个 reflog 版本 | 问题恢复 |
git branch recover <reflog-hash> | 从 reflog 哈希新建分支救回提交 | 问题恢复 |
git fsck --lost-found | 找悬挂对象（未被任何 ref 引用的提交/对象） | 问题恢复 |
git stash list && git stash show -p <id> | 找回失踪 stash 内容 | 问题恢复 |
git restore --staged --worktree -- . ⚠ 不可恢复未提交的改动 | 一把丢弃所有未提交改动 | 问题恢复 |
git revert -m 1 HEAD | 紧急回滚刚刚合到主干的合并 | 问题恢复 |
git push --force-with-lease origin <branch> | 修复 rebase 后安全更新远端 | 问题恢复 |
git checkout <hash> -- <file> | 从历史某个 commit 恢复单个文件到工作区 | 问题恢复 |
git diff --diff-filter=D --name-only HEAD~1 HEAD | 列出最近一次提交里删除的文件 | 问题恢复 |
git log --diff-filter=D --summary -- <path> | 查 path 是哪次提交被删除的 | 问题恢复 |
git bisect start && git bisect bad && git bisect good <hash> | 二分定位引入 bug 的提交 | 问题恢复 |
git bisect run ./test.sh | 自动化二分（脚本退出码 0 = good） | 问题恢复 |
git bisect reset | 结束二分，回到原状 | 问题恢复 |
git rebase -i --root ⚠ 改写公共历史会让协作者本地状态错乱 | 从根开始交互式重写整个分支历史 | 问题恢复 |
git commit --fixup=<hash> && git rebase -i --autosquash | 为既有 commit 生成 fixup 并自动压扁 | 问题恢复 |
git config --global user.name "Tao" | 全局用户名 | 配置 |
git config --global user.email "you@x" | 全局邮箱 | 配置 |
git config --global init.defaultBranch main | init 默认主分支为 main | 配置 |
git config --global core.editor "vim" | 默认编辑器 | 配置 |
git config --global pull.rebase true | pull 默认走 rebase | 配置 |
git config --global rerere.enabled true | 开启冲突复用记忆 | 配置 |
git config --global alias.lg "log --oneline --graph --all --decorate" | 常用 alias：git lg | 配置 |
git config --global alias.s "status -sb" | alias：git s | 配置 |
git config --global core.excludesfile ~/.gitignore_global | 全局 .gitignore | 配置 |
git config --list --show-origin | 看所有配置及来源文件 | 配置 |
feat: 新功能 / fix: 修复 / chore: 杂项 | Conventional Commits 类型 | 提交规范 |
git commit -s -m "fix: ..." | 加 Signed-off-by（DCO） | 提交规范 |
git commit -m "fix(login): blah" -m "BREAKING CHANGE: ..." | 多行带 footer 的提交 | 提交规范 |
git commit --fixup=<hash> | 生成 fixup 提交，配合 rebase --autosquash | 提交规范 |
git submodule add <url> path/ | 添加子模块 | submodule |
git submodule update --init --recursive | 克隆后初始化所有子模块 | submodule |
git submodule foreach "git pull origin main" | 所有子模块统一拉最新 | submodule |
git submodule deinit -f path/ && git rm -f path/ | 彻底移除子模块 | submodule |
git worktree add ../proj-feat feat/x | 在另一个路径并行 checkout 另一分支 | worktree |
git worktree list | 看所有 worktree | worktree |
git worktree remove ../proj-feat | 删除 worktree | worktree |
git worktree prune | 清理失效条目 | worktree |
git config --global commit.gpgsign true | 默认签名提交 | 签名 |
git config --global gpg.format ssh | 用 SSH key 签名（git ≥ 2.34） | 签名 |
git log --show-signature | 看提交签名校验情况 | 签名 |
git tag -s v1.0 -m "release" | 签名标签 | 签名 |
.git/hooks/pre-commit | 提交前钩子（lint/format） | 钩子/CI |
git config core.hooksPath .githooks | 把钩子目录纳入版本管理 | 钩子/CI |
GIT_AUTHOR_DATE=... GIT_COMMITTER_DATE=... git commit | 伪造提交时间 | 钩子/CI |
git rev-parse --short HEAD | 取当前短哈希（CI 标记常用） | 钩子/CI |
git rev-parse --abbrev-ref HEAD | 取当前分支名 | 钩子/CI |
git gc --prune=now --aggressive ⚠ 会清理 reflog 中过期对象 | 深度垃圾回收（极少需要） | 清理 |
git remote prune origin | 清理本地缓存中已删除的远端分支 | 清理 |
git branch --merged | grep -vE "(^\*|main|master)" | xargs -r git branch -d | 批量删除已合并分支 | 清理 |
git filter-repo --path secrets.txt --invert-paths ⚠ 需重写历史，所有协作者要重新 clone | 从历史中彻底移除敏感文件（推荐替代 filter-branch） | 清理 |
git lfs migrate import --include="*.bin" | 把大文件迁移到 Git LFS | 清理 |

共143 / 143 条 · 语义搜索：「找回」自动扩到 reflog/fsck，「冲突」自动扩到 merge/rebase/rerere；查询时按分数排序展示。