本页目录

记录:使用--allow-unrelated-histories

前情提要

这个博客网站曾经是一个Create React App项目,此前一直在Github仓库的master分支开发。

之前为了配置路径别名进行了eject,后来发现设置jsconfig.json就可以解决问题,于是一直想还原成没有eject的项目。当然,eject操作是不可逆的,于是我把原来的master分支备份到v1分支,再另建一个新项目,把旧代码迁移过来,然后把新项目强制pushmaster分支,这样就可以在master分支上继续新版本的开发。

问题

在新版本(暂且叫它v2)也就是现在的master分支上提交了数次commit后,我意识到一个问题:此前的做法导致原来v1版本的提交记录并没有迁移到master分支中,当前的master分支相当于从零开始。

img

我希望master分支仍然保留v1版本的提交,同时也在此基础上记录v2版本的提交。

解决步骤

首先找一个文件夹克隆仓库:

git clone https://github.com/1kuzus/1kuzus.github.io.git

切换到v1分支:

git checkout v1

然后使用--allow-unrelated-histories参数合并两个没有公共祖先的分支:

git merge master -X theirs --allow-unrelated-histories

上面的参数-X theirs是合并策略,在将master分支合并到v1分支发生冲突时选择master分支的更改。现在,两个分支的提交记录都被保留了,但是目录下会多出仅在master分支中存在的文件,删掉它们即可。或者更简单地,直接清空目录,把master分支中的内容复制过来。

接下来在执行git addgit commit之后提交这次删除操作,也就是把本地的v1分支提交到远程的master

git push origin v1:master

最后来到之前的开发目录,拉取最新的master分支。这步操作实际上并没有改变文件内容,只是多了提交记录。

cd path/to/work_dir
git pull origin master