在开始进行仓库合并之前先大致梳理一下合并的原理,这样才能在出错的时候找到合理的解决方案。如果想直接看操作,看具体操作部分即可
场景梳理:
- 仓库a和仓库b是并列关系,共同合并进一个新的仓库c中
- 仓库a和仓库b是从属关系,将仓库b作为仓库a的子仓库合并
原理浅析
以上的两种场景合并原理是类似的只是在操作上略微有一点点差异。这里先说总的原理,再来分析具体的差异。
概念:为了方便理解,我们先假设需要将仓库a和b合并作为子目录合并进仓库c,以下先以这个例子进行讲解。
合并原理:
- 设置远端: 将需要并入的仓库a和b作为远端仓库加入进目标仓库c
- fetch: 将远端仓库a和b使用fetch拉到本地
- 创建分支: 将拉下来的代码作为新的分支进行创建
- 合并分支: 带参数–allow-unrelated-histories将分支a和b合并进主分支
至此,仓库a和b就保留git提交记录合并进了c。
原理在于分支合并是不丢失git提交记录的 关键点是–allow-unrelated-histories,因为这允许不相关的提交被合并。
场景差异: 刚刚说到两种场景会有一些差异,差异点在于: 如果是b作为子目录合并进a,那么b中的文件不会覆盖a,以package.json为例子来说:
// 合并后b的package.json在自己目录下
a/b/package.json
// a的文件在
a/package.json
但是对于a和b合并进c来说,package.json都在根目录就会冲突,解决方案是使用git mv将a和b都往子目录挪动一级。具体操作参照下方的具体操作。第一步是挪动文件,挪不挪根据自己的具体项目确定。
具体操作:
ls -A | grep -wv '.git\|performance-monitor' | xargs -t -I '{}' git mv {} performance-monitor/{}
git add .
git commit -m 'combine(*) mv performance'
mkdir exception
ls -A | grep -wv '.git\|exception' | xargs -t -I '{}' git mv {} exception/{}
git add .
git commit -m 'combine(*) mv exception'
git remote add exception ./exception-sdk
git remote add performance ./performance-sdk
git fetch exception
git fetch performance
git checkout -b exception exception/master
git checkout -b performance performance/master
git merge performance --allow-unrelated-histories
git merge exception --allow-unrelated-histories
git remote remove exception
git remote remove performance
|