记录:使用--allow-unrelated-histories
前情提要
这个博客网站曾经是一个Create React App
项目,此前一直在Github仓库的master
分支开发。
之前为了配置路径别名进行了eject
,后来发现设置jsconfig.json
就可以解决问题,于是一直想还原成没有eject
的项目。当然,eject
操作是不可逆的,于是我把原来的master
分支备份到v1
分支,再另建一个新项目,把旧代码迁移过来,然后把新项目强制push
到master
分支,这样就可以在master
分支上继续新版本的开发。
问题
在新版本(暂且叫它v2
)也就是现在的master
分支上提交了数次commit
后,我意识到一个问题:此前的做法导致原来v1
版本的提交记录并没有迁移到master
分支中,当前的master
分支相当于从零开始。
我希望master
分支仍然保留v1
版本的提交,同时也在此基础上记录v2
版本的提交。
解决步骤
首先找一个文件夹克隆仓库:
Bash
git clone https://github.com/1kuzus/1kuzus.github.io.git
切换到v1
分支:
Bash
git checkout v1
然后使用--allow-unrelated-histories
参数合并两个没有公共祖先的分支:
Bash
git merge master -X theirs --allow-unrelated-histories
上面的参数-X theirs
是合并策略,在将master
分支合并到v1
分支发生冲突时选择master
分支的更改。现在,两个分支的提交记录都被保留了,但是目录下会多出仅在master
分支中存在的文件,删掉它们即可。或者更简单地,直接清空目录,把master
分支中的内容复制过来。
接下来在执行git add
、git commit
之后提交这次删除操作,也就是把本地的v1
分支提交到远程的master
:
Bash
git push origin v1:master
最后来到之前的开发目录,拉取最新的master
分支。这步操作实际上并没有改变文件内容,只是多了提交记录。
Bash
cd path/to/work_dir
git pull origin master