Git 常用命令速查表 - 提交、分支、合并与回退大全
按提交、分支、回退、远程、提交历史五组整理了 Git 日常最常用命令:写错 commit 用 amend/restore/reset 回退,分支搞乱用 reflog/switch/rebase 找回,查代码变更用 git log 过滤。每条命令标注了在什么场景下用、什么时候慎用。
典型使用场景
日常版本控制:提交、分支、合并与变基、回退错误提交、找回误删的分支或暂存区内容,以及排查合并冲突与远程同步问题。
提交与暂存 6
git status -sgit add -pgit commit -m "msg"git commit --amendgit stashgit stash pop分支与合并 13
git branch -agit branch -vvgit switch -c feat/xgit merge --no-ff feat/xgit rebase maingit rebase -i HEAD~3git rebase --abortgit cherry-pick <sha>git push -u origin feat/xgit push origin --delete feat/xgit branch -d feat/xgit branch -D feat/xgit branch --merged回退与撤销 5
git restore <file>git restore --staged <file>git reset --soft HEAD~1git reset --hard HEAD~1git revert <sha>远程与排查 5
git remote -vgit fetch --prunegit log --oneline --graphgit refloggit blame <file>提交历史 git log 10
git log -pgit log --statgit log --author="Alice"git log --since="2 weeks ago"git log --grep="fix"git log -S "function_name"git log origin/main..HEADgit log --follow -- file.jsgit log --name-statusgit shortlog -sn常见问题 FAQ 5
Q: 如何撤销上一次提交?Q: git merge 和 git rebase 有什么区别?Q: 如何修改上一次提交的信息?Q: 如何暂存未完成的修改?Q: 如何解决合并冲突?高频补充命令(容量增强 · REQ-02) 37
git switch -c <branch>git switch <branch>git restore <file>git restore --staged <file>git restore --source=HEAD~1 <file>git sparse-checkout init --conegit worktree add ../hotfix maingit blame <file>git bisect startgit bisect good <commit>git bisect badgit shortlog -sngit log --oneline --graph --allgit log --statgit log -S 'functionName'git log --author='name' --since='2 weeks ago'git diff --stagedgit diff <a>...<b>git diff --name-onlygit show <commit>:<file>git refloggit rebase -i HEAD~3git rebase --onto <newbase> <old> <branch>git merge --no-ff <branch>git cherry-pick <commit>git cherry-pick <start>..<end>git revert <commit>git clean -fdgit clean -fdngit submodule add <url> <path>git submodule update --init --recursivegit tag -a v1.0 -m "msg"git push origin --tagsgit fetch --prunegit remote prune origingit rev-parse HEADgit update-index --assume-unchanged <file>参数矩阵
| 参数 | 作用 | 示例 |
|---|---|---|
--amend | 修改最近一次提交(补文件或改说明) | git commit --amend |
-p | 按片段(hunk)暂存,精细控制提交内容 | git add -p |
--soft/--mixed/--hard | reset 三种模式:保留/丢弃暂存/丢弃工作区 | git reset --soft HEAD~1 |
-i | 交互式变基,可合并/重排/改写提交 | git rebase -i HEAD~3 |
--rebase | 合并时优先变基保持线性历史 | git pull --rebase |
--no-ff | 合并保留合并提交,便于回溯分支 | git merge --no-ff feature |
-u | 推送时关联上游分支 | git push -u origin feature |
--force-with-lease | 安全强推,避免覆盖他人提交 | git push --force-with-lease |
--stat | 显示每次提交的改动统计 | git log --stat |
--graph | 图形化展示分支拓扑 | git log --oneline --graph |
易错点与避坑指南
现象git reset --hard 后误删的提交/改动找不回来。
原因--hard 同时丢弃暂存区与工作区,且未保留 reflog。
处置先用 git reflog 找到丢失提交的 SHA,再 git reset --hard <sha> 恢复;危险操作前先 git stash 或建分支。
现象push 被拒:non-fast-forward。
原因远端有本地没有的提交(他人已推送)。
处置先 git pull --rebase 把本地变基到远端之上,解决冲突后再 push,避免盲目 --force。
现象强制推送覆盖了同事的提交。
原因直接 git push --force 无视远端新提交。
处置一律用 git push --force-with-lease,它会在远端有本地未知提交时拒绝推送。
现象合并冲突后文件里出现 <<<<<<< 标记。
原因同一处被两边改动,Git 无法自动合并。
处置用 git status 看冲突文件,手动编辑去掉标记并保留正确内容,git add 后再 commit。
现象git stash 后内容貌似丢了。
原因stash 后未 pop/apply,或 stash 列表被清理。
处置git stash list 查看;git stash apply stash@{n} 恢复;若已 drop,可用 git fsck --lost-found 找回悬空对象。
现象提交里混入了不该提交的大文件/密钥。
原因未在 .gitignore 中排除,或提交后才加忽略。
处置用 git rm --cached 移除跟踪并用 BFG/filter-repo 重写历史;密钥立即作废并轮换。
排障路径
1找回误删的提交
git reflog列出 HEAD 的所有移动记录,定位丢失提交的 SHA 后用 reset 恢复。
2查看某次提交改了什么
git show <sha>同时看提交元信息与该提交的具体 diff。
3定位某行代码是谁、何时引入
git blame -L 10,20 file.ts输出每行的最近修改提交与作者,便于追责与回溯。
4合并冲突后确认未残留冲突标记
grep -rn "<<<<<<<" .提交前全局搜索冲突标记,避免把 <<<<<<< 提交进仓库。
命令示例
找回被 reset 丢弃的提交
git reset --hard HEAD~2\ngit reflog\ngit reset --hard HEAD@{2}reset --hard 后工作区被清空,但只要没跑 gc,reflog 仍记录每次 HEAD 移动,用 HEAD@{n} 就能找回上一位置。
输出
ba9c3e1 (HEAD) fix: drop temp debug log <- reflog 里的历史 HEAD\n8f10a42 feat: add pagination\nHEAD@{2}: reset: moving to HEAD~2挑选单个提交到当前分支
git log --oneline -3\ngit cherry-pick 9f2c14b想只拿另一个分支的某个提交,而不合并整个分支时用 cherry-pick;有冲突时按提示解决后 git cherry-pick --continue。
常见坑与注意事项
- git push origin --delete 和 git branch -D 不可逆,删除前用 git branch -a 和 git log 确认没有未合并内容。
- 对已推送到共享分支的提交做 reset 再强推,会覆盖队友的历史;共享提交一律用 revert。
- git clean -fd(本表未列)会删除未跟踪文件且默认不可恢复,务必先用 git clean -n 预览。
- git stash 默认不包含未跟踪文件,若想连同 untracked 一起收起用 git stash -u。
提示
- reset --hard 会丢弃改动,执行前确认;真丢了用 git reflog 找回。
- 已推送到共享分支的提交用 revert 撤销,不要 reset 后强推,否则坑队友。
- switch/restore 是较新的命令,比 checkout 语义更清晰,老脚本仍可用 checkout。
常见问题
git rebase 和 git merge 什么时候该用哪个?
merge 保留分叉历史并生成合并提交,适合共享分支(如把 feature 合回 main),便于整体回滚,不会改写已有提交;rebase 把当前分支的提交重放到目标分支之上、得到线性历史,适合个人功能分支整理,让 log 更清爽,但会改写提交,团队成员共用同一分支时慎用。
已推送的 commit 能用 git reset 撤销后强推吗?
不建议。reset 会改写历史,强推到共享分支会覆盖队友的提交,导致冲突甚至丢提交。对已推送的提交请用 git revert <sha> 生成反向提交来安全撤销。尚在本地未推送时再用 reset --soft/hard 没问题。
不小心把 node_modules 或 .env 提交进仓库了,怎么移除?
先用 git rm --cached <path> 停止追踪但保留本地文件,再把规则写进 .gitignore,最后提交一次。这只从版本库移除跟踪,不会删掉工作区文件;若仓库已含敏感内容,还需要重写历史并轮换密钥。
误删了分支或 reset 掉了提交,能找回吗?
能。只要没执行过 expunge(gc)清理,git reflog 会记录 HEAD 以及分支的历次移动,用 git reset --hard HEAD@{n} 或 git checkout -b <name> <sha> 即可回到那个位置。分支被删但提交仍在时,用 git reflog 找到 sha 直接建回分支。
git stash 存的改动突然不见了?
先 git stash list 看是否还在,用 git stash show -p stash@{0} 查看内容;若 pop 时产生冲突,改动会保留为冲突标记需手动解决。找不到时用 git fsck --lost-found 从对象库找回未引用的 stash 提交。
由 巧匠 维护
公开更新于 2026年9月10日,内容持续校对官方文档。