如何用另一个分支完全替换 main 分支
完全替换 main:git checkout main && git reset --hard <替换分支>,然后 git push --force-with-lease 强推。协作者需重置本地。更安全的方式是 merge -s ours 保留历史连续性。
硬替换:git checkout main && git reset --hard 替换分支名——main 的指针直接拨到替换分支的提交,然后 git push --force-with-lease 覆盖远程。历史就此改写。
操作步骤
git checkout main
git reset --hard new-main-content # main 指向新分支的提交
git push --force-with-lease # 覆盖远程
更温和的替代:ours 合并
强推改写历史对团队不友好。如果只是想"内容上新分支赢,但历史保持连续":
git checkout main
git merge -s ours new-main-content # 合并但内容全按 main……不对,方向反了
实际上要"内容全用对方"应该反过来:
git checkout new-main-content
git merge -s ours main # 吸收 main 的历史,内容保持新分支
git checkout main
git merge new-main-content # 快进,main 得到新内容+连续历史
git push
这样 main 的历史链没断,内容完全是新分支的,无需强推。
强推后的团队同步
# 每个协作者执行
git fetch
git reset --hard origin/main
常见问题(FAQ)
Q:什么时候需要这种操作?
项目推倒重来但想保留仓库(issues、star);主线误入歧途决定整体切换到重写分支。日常开发几乎用不到。
Q:GitHub 保护分支不让强推?
遵守仓库保护规则与团队审批流程;优先通过审查后的普通提交和合并请求更新内容,不要为了替换分支而绕过保护。
Q:旧 main 的历史会丢吗?
reset 前打个 tag 备份:git tag archive/old-main main——历史永远可回溯。