背景

项目远程仓库地址是A,将项目以名称为appclone在本地,而且在服务器上也以项目名称为appclone。由于一些原因,将远程仓库A迁移到远程仓库B,所以需要将远程服务器app的仓库地址由A改为B,但由于服务器的一些程序的限制,app文件名称不可以变,只需要变动里面的项目内容

  1. 远程仓库,有三次提交记录
    远程仓库
    远程仓库
  2. 本地仓库
    本地仓库
    本地仓库
    仓库地址
    仓库地址

一、仓库迁移

1. 将A仓库镜像到B仓库

名称为old仓库迁移到了名称为new仓库里

新的仓库地址
新的仓库地址

2.本地额外提交到old仓库两次记录

old仓库的提交记录
old仓库的提交记录
new仓库的提交记录
new仓库的提交记录

可以看到old仓库领先new仓库两次提交

远程服务器仓库的提交记录
远程服务器仓库的提交记录

3. 将new仓库内容与old仓库内容同步

因为old里面内容较新,所以讲old文件同步到new上,并且同步后再提交一次记录到new上

远程服务器仓库的提交记录
远程服务器仓库的提交记录

4. 将服务器仓库的地址变更为new仓库地址并更新

4.1. 服务器地址切换
远程服务器仓库地址切换
远程服务器仓库地址切换
4.2. 服务器git pull
远程服务器git pull
远程服务器git pull

可以看到更新失败需要手动处理冲突,其实关键就在这里如果服务跑一个程序比如说web服务,这些文件是web页面,那么此时web页面就会展示错误,因为文件里有待解决的冲突,那怎么解决呢?

二、解决方案

其实下面1、2方法在一定程度上是一个意思

1. 方法1

服务器clone最新的new仓库到app的同级目录,然后将本来存在的app删除,并将new仓库改名为app即可(mv也可以改名)

2. 方法2

服务器clone最新的new仓库到app的同级目录,将new文件下的.git 隐藏文件(工作区)移动到app文件下替换app的.git,git reset –hard HEAD^后git pull即可

3 git remote -set-url origin <新地址>

  1. 首先git remote -set-url origin <新地址>
  2. git fetch(拉取更新但不合并)
  3. git reset –hard origin/master (用远程服务器的origin/master替换本地、暂存区、版本库)

tip: 当更新仓库的时候用 git pull ,但是git pull 包含了两个操作 ,git fetch 和git merge,
git fetch 是将远程的master(默认)分支存储到本地的origin/master命名空间中,不会进行合并
但是有时候我们想用远程仓库的内容完全替换到本地的容:
git reset –hard origin/master
撤销本地、暂存区、版本库(用远程服务器的origin/master替换本地、暂存区、版本库)

总结

上面说了这么一大堆,其实都是我实际中遇到的坑坑,差点坑死我,不过上面说的确实是很麻烦,所以再总结一下
问题:切换远程分支避免遇到merge,或者说怎么更好的切换远程分支并更新
解决方案:上面三种