尝试将一个仓库的历史记录转移到另一个没有共同祖先的仓库,方法是添加源远程并在本地目标仓库上的一个分支上进行变基。
源代码:
A-B-C
\ /
E
需要的目标:
F-A'-B'-C'
\ /
E'
git rebase --rebase-merges的文档称它会保留拓扑结构并重新创建合并提交,但是:
这些合并提交中解决的任何冲突或手动修改都必须手动解决/重新应用。
现在,我想避免重新解决冲突,我对为什么需要这样做感到困惑。合并提交的内容已经在那里了,我可以将HEAD分离。
所以,我尝试了:
$ git rebase -i --onto destnewbranch --root --rebase-merges srcbranch
Could not apply C... master # Merge branch 'master'
(detached HEAD|REBASE x/y)
$ git status
interactive rebase in progress; onto F
Last commands done (n commands done):
pick B
merge -C C master # Merge branch 'master'
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
为了解决冲突问题,我正在采用C盘的内容。
$ git reset --hard C
现在的内容不错,但历史记录不行,所以:
$ git reset --soft HEAD@{1}
现在只需要继续进行变基操作:
$ git commit
$ git rebase --continue
然而,历史是错误的,因为我现在只剩下:
F-A'-B'-C'
C'并不是一个合并提交,尽管它包含了B和E的修改结果。
那些没有引起冲突的合并提交,在重新设置时可以成功地保留拓扑结构。
我认为是我在重置时搞糊涂了REBASE的MERGING状态,并且最终的git提交将不会创建一个合并提交,而是一个普通的提交。如果我不进行重置并手动解决冲突,git commit 将会创建一个合并提交。
git版本号为2.26.0.windows.1