Git重置后推送失败,如何正确回退不必要的提交?
嘿,我来帮你搞定这个Git回退的麻烦事儿!你现在遇到的核心问题很典型:本地已经回退了错误提交,但远程仓库还保留着那条错误的提交记录,直接推送会因为本地分支比远程“落后”被拒,而pull又会把远程的错误记录重新同步回来,等于白忙活了。
下面分两种场景给你对应的解决方案:
场景1:这个远程分支只有你在用(或团队所有人都同意改写历史)
这种情况可以放心地覆盖远程的历史,步骤很简单:
- 先确认本地已经处于正确的提交状态(就是你执行
git reset HEAD~后的那个版本),可以跑个git log看看当前HEAD指向的是不是你想要的提交。 - 执行安全的强制推送命令,把本地的正确历史同步到远程:
这里用git push origin <你的分支名> --force-with-lease--force-with-lease比粗暴的--force更稳妥,它会先检查远程分支有没有其他人的新提交,避免不小心覆盖了同事的工作。
场景2:多人协作的公共分支(绝对不能改写公共历史)
如果这个分支还有其他同事在使用,强制推送改写历史会让所有人的本地仓库都出现冲突,这时候得用**撤销提交(revert)**的方式,它不会删除旧提交,而是生成一个新提交来抵消错误更改:
- 先把远程的错误提交拉回本地(你之前pull已经恢复了,现在本地应该能看到那个错误提交),执行:
执行后Git会自动打开编辑器让你写撤销提交的说明,保存退出就行。git revert HEAD - 然后正常推送这个新的撤销提交:
这样其他同事pull的时候只会拿到这个新的撤销提交,完全不会影响他们的工作。git push origin <你的分支名>
额外唠两句为啥会这样
- 之前
git reset后push失败:因为远程分支的提交比你本地的“新”(你本地回退了,远程还停留在错误提交),Git默认不允许你用旧历史覆盖新的,所以才会提示"Updates were rejected because the tip of your current branch is behind"。 - 为啥
git pull会恢复错误提交?因为pull本质是git fetch + git merge,它会把远程的错误提交合并到本地,自然就又回到之前的状态了。
内容的提问来源于stack exchange,提问作者Nicky Mirfallah
相关产品推荐
相关产品推荐

