git将一个分支的代码强制覆盖到另一个分支

背景

当前开发的项目一共两个分支,一个是默认的master分支,另一个是dev1开发分支。由于master分支的代码很久都没更新了,今天试着将dev1分支的代码mergemaster分支,但是在合并的时候,出现了很多冲突,由于出现冲突的代码文件较多,不想一个一个文件去修改冲突(master分支的代码基本上就没啥需要了),所以就想到了将dev1分支的代码强制覆盖到master分支。

步骤

  1. 项目根目录下先切换到master分支
    	git checkout master
    
  2. 重置master分支的HEAD、索引和工作区dev1分支的重置 HEAD、索引和工作区保持一致
    	git reset --hard origin/dev1
    
  3. master分支上随便修改一些不会与dev1分支合并时造成冲突的文件(比如在.gitignore文件中随便添加一些内容)
  4. 提交更改并强制推送到远程仓库
    	git add .
    	git commit -m 'merge dev1 to master'
    	git push -f origin master
    
  5. 有时候远程仓库部署在gitlab的话,在执行最后一条命令git push -f origin master时会出现以下报错
    	(venv) pc@mypc:~/PycharmProjects/mypro$ git push -f origin master
    	对象计数中: 3, 完成.
    	Delta compression using up to 8 threads.
    	压缩对象中: 100% (3/3), 完成.
    	写入对象中: 100% (3/3), 316 bytes | 316.00 KiB/s, 完成.
    	Total 3 (delta 2), reused 0 (delta 0)
    	remote: GitLab: You are not allowed to force push code to a protected branch on this project.
    	To git.n.hahaha.com:dp-qa/mypro.git
    	! [remote rejected] master -> master (pre-receive hook declined)
    	error: 无法推送一些引用到 'git@git.n.hahaha.com:dp-qa/mypro.git'
    

这是因为gitlab对仓库启用了保护,需要在仓库中解除一下master分支的保护,等代码推送到远程仓库后,再把分支保护开启就可以了。

解决方法如下:
进入gitlab当前仓库详情页面,在项目的Settings页面下找到Protected Branches,再点击expand即可看到。有如下两种解决方法:

  1. 可以直接点该分支旁的Unprotect按钮,解除保护,但是这种方法不推荐
  2. 第二种方法是在Allowed to push下选择允许那些角色或具体那些用户可以提交,在这里可以选择你自己。

设置完毕后再重新提交就成功了。