如何在Git中用另一个分支完全替换master分支

如何在Git中用另一个分支完全替换master分支

技术背景

在Git的使用过程中,有时会遇到需要用一个分支的内容完全替换master分支的情况,比如当seotweaks分支经过大量修改和优化,需要将其内容覆盖到master分支上。

实现步骤

使用“ours”合并策略

  1. 确保本地master分支是最新的:
1
2
git checkout master
git pull
  1. 切换到seotweaks分支并使用“ours”策略合并master分支:
1
2
git checkout seotweaks
git merge -s ours master
  1. 切换回master分支并合并seotweaks分支:
1
2
git checkout master
git merge seotweaks

如果遇到fatal: refusing to merge unrelated histories错误,则将第四步修改为:

1
git merge --allow-unrelated-histories -s ours master

重命名分支

  1. 重命名本地master分支:
1
git branch -m master old-master
  1. 重命名seotweaks分支为master
1
git branch -m seotweaks master
  1. 强制推送新的master分支到远程:
1
git push -f origin master

注意:此操作可能会删除远程master分支上的提交,在运行git push -f origin master之前,请检查远程master分支。

更复杂的分支替换流程

  1. 重命名本地master分支:
1
git branch -m master master-old
  1. 删除远程master分支:
1
git push origin :master
  1. 在远程创建master-old分支:
1
git push origin master-old
  1. seotweaks分支上创建新的本地master分支:
1
git checkout -b master seotweaks
  1. 在远程创建新的master分支:
1
git push origin master

使用git push直接替换

1
git push [-f] origin seotweaks:master

此方法在遇到! [remote rejected] master (deletion of the current branch prohibited)错误且无法访问远程仓库的“Administration”选项卡时特别有用。

服务器配置修改

在托管origin仓库的服务器上,在仓库目录内执行以下操作:

1
git config receive.denyDeleteCurrent ignore

在本地工作站执行以下操作:

1
2
3
4
5
git branch -m master vabandoned                 # 重命名本地master分支
git branch -m newBranch master # 本地重命名newBranch为master
git push origin :master # 删除远程的master分支
git push origin master:refs/heads/master # 将新的master分支推送到远程
git push origin abandoned:refs/heads/abandoned # 将旧的master分支推送到远程

回到托管origin仓库的服务器,恢复配置:

1
git config receive.denyDeleteCurrent true

核心代码

使用“ours”合并策略

1
2
3
4
5
6
git checkout master
git pull
git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

重命名分支

1
2
3
git branch -m master old-master
git branch -m seotweaks master
git push -f origin master

更复杂的分支替换流程

1
2
3
4
5
git branch -m master master-old
git push origin :master
git push origin master-old
git checkout -b master seotweaks
git push origin master

使用git push直接替换

1
git push [-f] origin seotweaks:master

服务器配置修改

1
2
3
4
5
6
7
8
9
10
# 服务器端
git config receive.denyDeleteCurrent ignore
# 本地
git branch -m master vabandoned
git branch -m newBranch master
git push origin :master
git push origin master:refs/heads/master
git push origin abandoned:refs/heads/abandoned
# 服务器端
git config receive.denyDeleteCurrent true

最佳实践

  • 在进行分支替换操作之前,务必备份重要的代码和提交记录。
  • 与团队成员沟通,确保大家都知道即将进行的操作,避免冲突。
  • 对于强制推送操作(如git push -f)要谨慎使用,因为它会覆盖远程仓库的历史记录。

常见问题

  • fatal: refusing to merge unrelated histories:使用git merge --allow-unrelated-histories -s ours master解决。
  • ! [remote rejected] master (deletion of the current branch prohibited):可以使用git push [-f] origin seotweaks:master或修改服务器配置来解决。
  • 其他用户拉取失败:当远程master分支被删除后,其他用户拉取会失败。当master分支重新创建后,拉取会尝试合并新的master分支,可能会产生大量冲突。其他用户需要使用git reset --hard将本地master分支重置为远程master分支。

如何在Git中用另一个分支完全替换master分支
https://119291.xyz/posts/how-to-replace-master-branch-in-git-entirely-from-another-branch/
作者
ww
发布于
2025年5月21日
许可协议