跨代码仓库迁移变更最佳实践:保留提交历史的方案咨询
我在GitHub的main分支有提交历史:= A --- B --- C,同事将Commit A复制到Gitlab的main分支形成Commit D,之后Gitlab的main分支新增了Commit E,当前提交结构如下:
= A --- B --- C (Github main) = D --- E (Gitlab main)
其中=表示GitHub的提交历史在Gitlab中被保留。
我希望将Commit C迁移到Gitlab,同时完整保留GitHub的提交历史,最终目标状态如下:
= A --- B --- C (Github main) // 保持不变 = A --- B --- C (Gitlab main) = D --- E (Gitlab temp)
目前我只能通过复制Commit C内容创建新Commit F来实现,但想寻求更优方案。
可以通过Git的变基(rebase)操作结合分支管理来实现你的需求,具体步骤如下:
备份Gitlab原main分支
先将Gitlab当前的main分支备份到temp分支,防止操作失误丢失原有提交:git checkout main git branch temp添加GitHub仓库为远程源
在本地的Gitlab仓库中,将GitHub仓库添加为远程仓库(命名为github)并拉取最新代码:git remote add github <GitHub仓库URL> git fetch github将Gitlab main分支变基到GitHub main
切换回Gitlab的main分支,执行变基操作,将其历史对齐到GitHub的main分支:git checkout main git rebase github/main执行后,Git会先暂存Gitlab main分支上从D开始的提交(即E),然后将main分支指针移动到GitHub main的最新提交C上,再尝试将暂存的E提交重新应用到C之后。如果遇到代码冲突,手动解决冲突后执行
git add <冲突文件>,再运行git rebase --continue直到变基完成。强制推送变基后的分支到Gitlab
由于变基修改了提交历史,需要强制推送到Gitlab的main分支:git push origin main --force注意:如果有其他协作者正在使用Gitlab的main分支,需提前告知,避免他们的本地代码出现冲突。
完成以上步骤后,Gitlab的main分支就会拥有和GitHub完全一致的A-B-C提交历史,原有的D-E提交则保留在temp分支中,完全符合你的理想状态。
内容的提问来源于stack exchange,提问作者SKPS

