如何删除分支上的某个提交
删除最近未推送的提交:git reset --hard HEAD~1;保留改动只撤销提交用 git reset --soft HEAD~1。删除历史中间的提交用 git rebase -i 标记 drop。已推送的提交用 git revert 反向提交,不要改写共享历史。
看提交位置和是否已推送:最近的、没推送的用 git reset --hard HEAD~1 直接抹掉;历史中间的用 git rebase -i 把该条标 drop;已经推送并被他人使用的提交不要删,用 git revert 生成反向提交来抵消它。
情况一:最近一次提交,未推送
git reset --hard HEAD~1 # 连改动一起丢弃
git reset --soft HEAD~1 # 撤销提交但改动回到暂存区
git reset --mixed HEAD~1 # 撤销提交,改动回工作区(默认)
删多个:HEAD~3 删最近 3 个。
情况二:历史中间的提交,未推送
git rebase -i <要删提交>^
# 编辑器里把该行的 pick 改成 drop(或 d),保存退出
情况三:已推送的提交
git revert <提交哈希> # 生成一个"反向操作"的新提交
git push
历史不改写,协作者无感,这是共享分支上唯一安全的"删除"。
强推的代价
坚持对已推送提交做 reset/rebase 的话,需要 git push --force-with-lease 强推,且协作者需要根据各自未提交、未推送工作的情况重新对齐分支,不能要求所有人直接 hard reset;操作前应先协调和备份。
常见问题(FAQ)
Q:reset --hard 误删了提交能找回吗?
在提交对象尚未被清理时可能恢复:git reflog 找到被删提交的哈希,git reset --hard <哈希> ;优先用 git branch recovery <哈希> 建分支确认内容。
Q:revert 和 reset 的本质区别?
revert 是"新增一个反向提交"(历史前进),reset 是"把分支指针拨回去"(历史改写)。前者安全可共享,后者只适合未公开的历史。
Q:rebase drop 时报冲突?
被删提交的后续提交依赖了它的改动。解决冲突后 --continue,或重新评估:也许该用 revert。