如何删除还未推送的本地提交
删除未推送的本地提交用 git reset:--hard HEAD~N 连改动一起丢弃,--soft 保留改动到暂存区,--mixed(默认)保留改动到工作区。不确定时用 git reflog 随时可找回。
未推送的提交可以改写,但应先确认是否需要保留其中的改动:git reset --hard HEAD~N 把最近 N 个提交连同改动一起丢弃;想保留改动用 --soft(回暂存区)或 --mixed(回工作区,默认)。因为还没推送,改写历史不影响任何人。
三种 reset 模式
git reset --hard HEAD~1 # 删提交 + 丢改动(会丢弃工作区改动)
git reset --mixed HEAD~1 # 删提交,改动回工作区
git reset --soft HEAD~1 # 删提交,改动回暂存区(马上重新提交)
删到指定的干净状态
git log --oneline # 找到想回到的提交
git reset --hard a1b2c3d # 回到它,之后的提交全部丢弃
删错了怎么救
reset 不删对象,只是移动指针。对象尚存时可以尝试恢复,没有固定的保证窗口:
git reflog # 找到被删提交的哈希
git reset --hard <哈希> # 或 git branch 找回 <哈希>
常见问题(FAQ)
Q:怎么确认哪些提交还没推送?
git status 会显示 "ahead of origin/main by N commits";git log origin/main..HEAD --oneline 列出这些提交。
Q:只想改最后一个提交而不是删?
用 git commit --amend:补文件、改信息都靠它,比 reset 后重提更顺手。
Q:已经推送了还能这样删吗?
技术上强推可以,但共享分支上这是协作事故。已推送的用 git revert 做反向提交。