发布于2026-05-30 阅读(0)
扫一扫,手机访问
这个坑,基本上每个用Git的开发者都会踩一次:

刚执行完commit,顺手就push上去了。
过了两分钟才反应过来:这次提交不应该上去。
但问题是——
代码本身还要留着继续改,不能直接删掉。
这篇文章只解决一件事:
如何把提交从历史中抹掉,同时让代码留在本地
公共分支上请慎用这个方法,独立开发时可以放心使用。
如果你只是遇到这种情况:
记住下面两步就够了:
git reset HEAD~1 git push --force-with-lease origin main
执行完成后:
git log 也查不到大多数情况下,到这一步就解决问题了。
git reset HEAD~1
意思是让当前分支指针倒退一个提交位置。
但注意:它不会删除你的代码,只是把:
所以你会看到文件还在,只是状态变成了“未提交”。
git push --force-with-lease origin main
用你当前本地的 main 分支,覆盖远端 main 的内容。
也就是把刚才“回退后的状态”同步到远程仓库。
有些人不太喜欢“直接把当前分支推上去”的方式,更希望明确指定要回到哪个提交。这时可以用commit id来实现。
最简单的方法:
git log --oneline
比如看到这样:
070505c github page ← 这是你想撤回的提交 ff775f6 first commit ← 这是你要回退到的位置
记住:你需要的是前一个“正确提交”的id。
如果想看更清晰的视图:
git log --oneline --graph --decorate -5
git reset --mixed ff775f6
效果是:提交记录回退了,代码还在,但不在暂存区。
如果你希望改动仍保留在暂存区:
git reset --soft ff775f6
git push --force-with-lease origin ff775f6:main
这句的意思很直白:让远端 main 分支指向 ff775f6 这个提交。
这正是很多人需要的操作:撤回提交但保留代码。
你可能见过这种写法:
git reset --hardgit push --force-with-lease origin :main git cherry-pick --no-commit <某个提交>
这套操作属于补救方案,不是常规操作。
它通常适用于:已经用 reset --hard 清掉了代码,或者想只恢复某一次提交的内容。
在正常情况(刚提交就反悔)下,用不到这种较重的操作。
很多教程会推荐使用:
git revert
但它做的是新增一个“反向提交”,换句话说:原来的错误提交还在,只是多了一次撤销它的提交记录。
如果你的目标是让这次提交彻底从历史中消失,那就不要用 revert。
有,而且需要说清楚。
因为使用了:
git push --force-with-lease
这属于改写历史的操作。
如果在push之前,别人已经往 main 分支提交了新代码,那么这一push可能会把对方的提交顶掉。
改了远端历史之后,其他人本地的历史还是旧的,pull或push时可能产生冲突,甚至把你删掉的提交再带回来。
特别是 main 分支正在被多人提交时。
git push --force-with-lease
而不是:
git push --force
前者至少会检查远端有没有被别人改过。
git fetch origin git log --oneline --graph --decorate --all -10
这种情况更建议用:
git revert
如果你只是“刚push,想撤回,但代码要留着”,记住这套命令就够了:
git reset HEAD~1 git push --force-with-lease origin main
如果你希望完全可控(明确回到某个点):
git log --oneline git reset --mixedgit push --force-with-lease origin :main
这件事本质其实就一句话:删的是提交记录,不是代码内容。
理解这个核心操作,Git基本就算入门了。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8