L LvOnce 工具集

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/xfeat/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 / --abortrebase 中流程控制合并/变基
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 maininit 默认主分支为 main配置
git config --global core.editor "vim"默认编辑器配置
git config --global pull.rebase truepull 默认走 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看所有 worktreeworktree
git worktree remove ../proj-feat删除 worktreeworktree
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;查询时按分数排序展示。