无法修复本地状态时,如何撤销推送到GitHub的12532条重复提交?
无法修复本地状态时,如何撤销推送到GitHub的12532条重复提交?
这种大规模提交重复的情况确实让人头大,别慌,咱们一步步来把远程分支拉回正轨:
第一步:找到远程分支在坏推送前的最后正常提交
首先你需要定位到preload-scene-dask-delayed分支在你那次错误push之前的最后一个正常提交哈希值。你可以通过GitHub的UI来操作:
- 打开你的GitHub仓库,切换到
preload-scene-dask-delayed分支的提交历史页面 - 往下翻找,找到你push那12532条重复提交之前的最后一个有效提交(也就是没有重复的那个版本)
- 点击该提交的哈希值(一串7位或更长的字母数字),复制完整的SHA-1值
如果提交太多翻起来麻烦,也可以用Git命令查看远程分支的历史(即使现在远程是坏的,Git依然会保留之前的提交记录):
git log --oneline origin/preload-scene-dask-delayed
从输出里找到那个正常的提交哈希即可。
第二步:强制重置远程分支到正常状态
拿到正确的提交哈希后(假设是40f00d3,也就是你示例里的第一个正常提交),用以下命令强制将远程分支指向这个旧提交:
git push origin +40f00d3:preload-scene-dask-delayed
这里的+符号是关键,它告诉Git忽略当前远程分支的状态,直接覆盖成你指定的提交。
第三步:同步本地分支到修复后的远程状态
现在远程已经恢复正常了,你需要把本地的坏分支也同步过来:
git checkout preload-scene-dask-delayed git reset --hard origin/preload-scene-dask-delayed
这个命令会把本地分支强制重置为和远程完全一致的状态,注意这会清除本地该分支上所有未提交的修改,如果有需要保留的内容,记得先备份。
第四步:提醒协作者同步分支
如果有其他同事也在使用这个分支,一定要告诉他们不要直接pull,而是执行以下命令同步本地状态:
git checkout preload-scene-dask-delayed git fetch origin git reset --hard origin/preload-scene-dask-delayed
避免他们把本地的坏提交再次推送到远程。
额外提示
如果实在找不到那个正常提交的哈希,还可以去GitHub仓库的「Insights」→「Network」页面,查看分支的历史变迁,找到你那次错误push的节点,就能看到push之前的分支状态对应的提交哈希了。
另外,强制推送虽然能解决问题,但要谨慎使用——如果这个分支是多人协作的公共分支,一定要确保所有人都知情,避免造成数据丢失。
内容来源于stack exchange
相关产品推荐
相关产品推荐

