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;查询时按分数排序展示。