如何在Git中用另一个分支完全替换master分支
技术背景
在Git的使用过程中,有时会遇到需要用一个分支的内容完全替换master
分支的情况,比如当seotweaks
分支经过大量修改和优化,需要将其内容覆盖到master
分支上。
实现步骤
使用“ours”合并策略
- 确保本地
master
分支是最新的:
1 2
| git checkout master git pull
|
- 切换到
seotweaks
分支并使用“ours”策略合并master
分支:
1 2
| git checkout seotweaks git merge -s ours master
|
- 切换回
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
|
重命名分支
- 重命名本地
master
分支:
1
| git branch -m master old-master
|
- 重命名
seotweaks
分支为master
:
1
| git branch -m seotweaks master
|
- 强制推送新的
master
分支到远程:
1
| git push -f origin master
|
注意:此操作可能会删除远程master
分支上的提交,在运行git push -f origin master
之前,请检查远程master
分支。
更复杂的分支替换流程
- 重命名本地
master
分支:
1
| git branch -m master master-old
|
- 删除远程
master
分支:
- 在远程创建
master-old
分支:
1
| git push origin master-old
|
- 在
seotweaks
分支上创建新的本地master
分支:
1
| git checkout -b master seotweaks
|
- 在远程创建新的
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 git branch -m newBranch master git push origin :master git push origin master:refs/heads/master git push origin abandoned:refs/heads/abandoned
|
回到托管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
分支。