无需执行git pull,如何覆盖指定提交后的所有提交?
最佳解决方法:强制推送覆盖远程master分支
这种情况是因为你的本地master分支和远程master分支的提交历史已经出现分叉——远程分支包含了你执行git reset --hard <旧提交>之后的新提交,而你的本地分支是基于那个旧提交重新构建的新历史,Git默认会阻止这种推送(避免丢失远程的提交记录)。
如果你确认远程分支上那些需要拉取的提交完全不需要保留,可以用以下方法直接覆盖:
步骤1:确认操作风险
强制推送会永久删除远程分支上你reset之后的所有提交,这个操作是不可逆的,一定要确保这些远程提交没有价值或者已经做好备份!
步骤2:执行强制推送
基础强制推送命令
直接用本地分支覆盖远程分支:
git push --force origin master
这个命令会忽略本地和远程的历史差异,强制让远程master分支和你的本地分支保持一致。
更安全的强制推送(推荐)
如果你的Git版本较新(2.3.0+),或者仓库有分支保护设置,建议使用--force-with-lease参数,它会先检查远程分支在你上次拉取后有没有新的提交,如果有就会终止推送,避免误覆盖别人刚提交的内容:
git push --force-with-lease origin master
后续注意事项
因为项目只有master分支,且你明确要覆盖远程内容,这个方法是最直接有效的。之后其他协作成员拉取代码时,会发现本地分支和远程不一致,他们需要执行git reset --hard origin/master来同步远程的新历史,否则会遇到和你一样的推送冲突问题。
内容的提问来源于stack exchange,提问作者soultrust




