执行git reset回退旧提交后,推送代码至远程仓库与Heroku被拒该如何处理
操作前核心确认
执行所有推送操作前,先确认VSCode中打开的本地代码已经完全是你要部署到线上的正确版本,因为接下来的操作会直接覆盖远端仓库的现有提交记录,一旦确认错误会需要额外的恢复步骤。
报错原因说明
你执行git reset --hard回退代码时,是直接将本地master分支的提交指针移动到了你选中的旧正确提交节点。而不管是关联的origin源仓库,还是Heroku的部署仓库,远端master分支的指针还停留在你之前推上去的、有异常问题的新提交节点上。
Git默认的推送规则只允许“快进式推送”——也就是本地的提交必须是远端提交的后续版本,不允许本地把远端的提交历史回退到更早的节点,因此直接执行普通push就会被拦截,出现你看到的“当前分支落后于远端对应分支”的提示。
这里注意:千万不要按照报错提示里的建议执行
git pull操作,这类操作会主动把远端带bug的提交重新拉回本地做合并,你之前做的硬回退操作会完全失效,最后本地的提交历史里还是会包含那个有问题的版本,和你回退的初衷完全相悖。
正确的操作步骤
- 确认当前本地处于目标分支:执行
git branch,看输出列表里前面带*标记的分支名,如果不是master(或新版仓库常用的main),先执行git checkout master(或git checkout main)切到对应分支。 - 分别执行对应的强制覆盖推送命令:
- 同步推送到关联的公共源仓库origin:
git push origin master --force-with-lease - 推送到Heroku完成站点部署:
git push heroku master --force-with-lease - 如果你使用的是新版Heroku CLI,默认部署分支为main而非master,对应命令替换为:
git push heroku main --force-with-lease
- 同步推送到关联的公共源仓库origin:
- 参数说明:这里不用容易造成误删的
--force/-f参数,--force-with-lease会自动校验远端分支有没有你不知情的他人新提交,如果有额外的未同步内容会主动拦截推送,避免误删其他人的代码,对新手更友好。
操作后验证
- 终端返回推送成功提示,无之前的“分支落后于远端”的报错
- 打开线上Heroku站点,检查页面运行状态和本地代码预期效果一致
- 执行
git log --oneline -5查看本地最近5条提交记录,和远端仓库的分支提交列表比对,确认节点完全匹配
内容的提问来源于stack exchange,提问作者Drake Coleman
相关产品推荐
相关产品推荐

