如何删除还未推送的本地提交
删除未推送的本地提交用 git reset:--hard HEAD~N 连改动一起丢弃,--soft 保留改动到暂存区,--mixed(默认)保留改动到工作区。误操作后可用 git reflog 查找旧提交;仅在对象尚存时可能恢复,不保证找回未提交改动。
未推送的提交可以改写,但应先确认是否需要保留其中的改动:git reset --hard HEAD~N 把最近 N 个提交连同改动一起丢弃;想保留改动用 --soft(回暂存区)或 --mixed(回工作区,默认)。未推送到当前上游不代表没有通过其他远端、补丁或本地 worktree 共享,应先确认依赖。
HEAD~N 沿第一父链回溯 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 列出本地 HEAD 可达而该远程跟踪引用不可达的提交;先 fetch 更新状态,且这个结果不证明从未推到别的远端。
Q:只想改最后一个提交而不是删?
用 git commit --amend:补文件、改信息都靠它,比 reset 后重提更顺手。
Q:已经推送了还能这样删吗?
技术上强推可以,但共享分支上这是协作事故。已推送的用 git revert 做反向提交。