Git 常用命令速查表 - 提交、分支、合并与回退大全

按提交、分支、回退、远程、提交历史五组整理了 Git 日常最常用命令:写错 commit 用 amend/restore/reset 回退,分支搞乱用 reflog/switch/rebase 找回,查代码变更用 git log 过滤。每条命令标注了在什么场景下用、什么时候慎用。

版本控制·共 81 条命令·最后更新 2026-09-10
git分支回退合并

典型使用场景

日常版本控制:提交、分支、合并与变基、回退错误提交、找回误删的分支或暂存区内容,以及排查合并冲突与远程同步问题。

提交与暂存 6

git status -s
单行紧凑查看状态:已修改/已暂存/未跟踪分别标记,?? 表示未跟踪文件,提交前快速扫一眼用
git add -p
逐块选择要暂存的改动,只提交同一文件里的一部分;对大改动的提交尤其有用,进入后按 y/n/s 逐块决定
git commit -m "msg"
提交暂存区改动;注意只提交 git add 过的文件,未 add 的改动不会进本次提交
git commit --amend
修改最后一次提交的信息或内容;仅适合尚未推送的提交,已推送请改用 revert 或再补一个 commit
git stash
临时收起工作区改动,用于切分支救火;默认不含未跟踪文件,连同 untracked 一起收起用 git stash -u
git stash pop
恢复最近一次 stash 的改动;若有冲突会保留冲突标记供你手动解决

分支与合并 13

git branch -a
列出本地和远程分支
git branch -vv
查看本地分支与远程的跟踪关系
git switch -c feat/x
创建并切换到新分支(新写法)
git merge --no-ff feat/x
合并分支并保留"合并提交"节点,后续想整体回滚整个功能分支时更清晰
git rebase main
把当前分支的提交逐个重放到 main 之上,保持线性历史,避免 merge 产生的分叉;共享分支上慎用
git rebase -i HEAD~3
交互式变基,改写最近 3 个提交:可 reword 改信息、squash 合并、drop 删除,push 前整理提交历史用
git rebase --abort
变基或 cherry-pick 冲突解不开时放弃重来,回到变基前的状态
git cherry-pick <sha>
把其他分支的单个提交应用到当前分支,只取一个提交而不合并整条分支
git push -u origin feat/x
首次推送并设置上游跟踪,之后直接 git push 即可,不用再带分支名
git push origin --delete feat/x
删除远程分支;执行前用 git branch -a 确认对应功能已合并,删除不可逆
git branch -d feat/x
删除已合并进当前分支的本地分支;若提示未合并说明有独有提交,改用 -D 需谨慎
git branch -D feat/x
强制删除未合并分支,独有提交会丢失且不可恢复,删除前务必确认
git branch --merged
列出已合并到当前分支的分支,清理本地多余分支前先看这份清单

回退与撤销 5

git restore <file>
丢弃工作区文件改动(新写法)
git restore --staged <file>
把文件移出暂存区,保留改动
git reset --soft HEAD~1
撤销最后一次提交,保留改动在暂存区
git reset --hard HEAD~1
彻底丢弃最后一次提交和改动,慎用
git revert <sha>
生成反向提交撤销某次改动,安全可推共享分支

远程与排查 5

git remote -v
查看当前仓库的远程地址与别名,确认 origin 指向哪里;换仓库源或加别名时第一步
git fetch --prune
拉取远程最新提交并清理本地已失效的远程分支引用,合并前先 fetch 保持最新
git log --oneline --graph
以图形树的方式查看提交历史与分支分叉,快速理解仓库结构
git reflog
查看 HEAD 的所有移动记录,包括被 reset/回退"丢掉"的提交;误操作后找回提交的救命稻草
git blame <file>
逐行标出每行代码的最后修改人与提交,排查是谁引入某段逻辑或某次回归时用

提交历史 git log 10

git log -p
查看每次提交的完整 diff
git log --stat
查看每次提交的文件变更统计
git log --author="Alice"
按作者过滤提交
git log --since="2 weeks ago"
查看最近两周的提交
git log --grep="fix"
按提交信息关键词过滤
git log -S "function_name"
找出新增或删除该字符串的提交(pickaxe)
git log origin/main..HEAD
查看本地未推送的提交
git log --follow -- file.js
跟踪文件含重命名的完整历史
git log --name-status
显示每次提交变更的文件及状态(A/M/D)
git shortlog -sn
按作者统计提交数

常见问题 FAQ 5

Q: 如何撤销上一次提交?
A: git reset --soft HEAD~1 撤销提交但保留改动在暂存区;git reset --hard HEAD~1 彻底丢弃(慎用)。已推送的提交用 git revert <sha>。
Q: git merge 和 git rebase 有什么区别?
A: merge 保留分支历史(生成合并提交),适合公共分支;rebase 线性化提交历史(重写提交),适合个人分支整理。
Q: 如何修改上一次提交的信息?
A: git commit --amend 修改最后一次提交的 message 或内容。如果已推送,需 git push --force-with-lease,注意团队协作安全。
Q: 如何暂存未完成的修改?
A: git stash 临时收起工作区改动,切分支救火后 git stash pop 恢复。git stash list 查看所有 stash。
Q: 如何解决合并冲突?
A: 冲突文件会标记 <<<<<<< HEAD 和 >>>>>>> branch,手动编辑后 git add <file> 标记已解决,再 git commit 完成合并。

高频补充命令(容量增强 · REQ-02) 37

git switch -c <branch>
新建并切换到分支(比 checkout -b 语义更清晰)
git switch <branch>
切换到已存在的分支
git restore <file>
丢弃工作区中某文件的未暂存改动
git restore --staged <file>
将文件移出暂存区(取消 git add)
git restore --source=HEAD~1 <file>
从指定版本恢复某文件
git sparse-checkout init --cone
启用稀疏检出,只拉取部分目录
git worktree add ../hotfix main
新建工作树并行处理另一分支
git blame <file>
查看每行最后修改的作者与提交
git bisect start
开始二分查找引入问题的提交
git bisect good <commit>
标记已知良好的提交
git bisect bad
标记当前有问题的提交
git shortlog -sn
按作者统计提交数量
git log --oneline --graph --all
图形化查看全部分支历史
git log --stat
查看提交及每个文件改动行数统计
git log -S 'functionName'
查找改动过某字符串的提交
git log --author='name' --since='2 weeks ago'
按作者与时间段筛选提交
git diff --staged
查看暂存区与上次提交的差异
git diff <a>...<b>
查看两分支的分叉点差异
git diff --name-only
仅列出有改动的文件名
git show <commit>:<file>
查看某次提交中某文件的内容
git reflog
查看引用日志,找回误删的提交
git rebase -i HEAD~3
交互式变基,合并/重排最近 3 个提交
git rebase --onto <newbase> <old> <branch>
将分支变基到新的基线上
git merge --no-ff <branch>
禁用快进合并,保留合并提交记录
git cherry-pick <commit>
把某个提交应用到当前分支
git cherry-pick <start>..<end>
批量挑选一段提交区间
git revert <commit>
生成一个反向提交安全回退(不改写历史)
git clean -fd
删除未跟踪文件与目录(危险,先 -n 预览)
git clean -fdn
预览将被 clean 删除的文件,不实际执行
git submodule add <url> <path>
添加 Git 子模块
git submodule update --init --recursive
递归初始化并更新子模块
git tag -a v1.0 -m "msg"
创建带说明的附注标签
git push origin --tags
推送本地所有标签到远程
git fetch --prune
获取更新并清理已删除的远程分支引用
git remote prune origin
修剪本地陈旧的远程跟踪分支
git rev-parse HEAD
输出当前 HEAD 的完整提交哈希
git update-index --assume-unchanged <file>
临时让 Git 忽略某文件改动

参数矩阵

参数作用示例
--amend修改最近一次提交(补文件或改说明)git commit --amend
-p按片段(hunk)暂存,精细控制提交内容git add -p
--soft/--mixed/--hardreset 三种模式:保留/丢弃暂存/丢弃工作区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. 1找回误删的提交

    git reflog

    列出 HEAD 的所有移动记录,定位丢失提交的 SHA 后用 reset 恢复。

  2. 2查看某次提交改了什么

    git show <sha>

    同时看提交元信息与该提交的具体 diff。

  3. 3定位某行代码是谁、何时引入

    git blame -L 10,20 file.ts

    输出每行的最近修改提交与作者,便于追责与回溯。

  4. 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日,内容持续校对官方文档。

联系我们

命令或描述有误?提交反馈、商务合作或产品建议都可发送邮件给我们。

联系我们