原远程仓库已失效的两个Git仓库如何双向同步并合并提交历史
Git 双仓库双向同步线性历史操作方案
问题背景
现有两台新服务器,其上的Git仓库均克隆自已下线的旧服务器,初始版本为r1,两台服务器后续各自产生了独立提交,形成分叉历史:
r1 - 旧服务器上的初始版本 / \ r1 - 克隆到新服务器1 r1 - 克隆到新服务器2 | | r2 r4 | | r3 r5
注:如果你的仓库默认分支名为master,把后续命令中的main替换为master即可。
预期效果
调整后两台服务器仓库可直接执行push/pull实现双向同步,提交历史保持线性,最终统一结构如下:
r1 - r2 - r3 - r4 - r5
操作步骤
以下操作基于你提供的复现环境(tmpA对应新服务器1,tmpB对应新服务器2)执行,可直接对应到实际服务器操作:
步骤1:清理无效远程配置,互相设置为默认源
在tmpA(新服务器1)执行:
# 删除指向旧服务器的无效origin git remote remove origin # 将已添加的另一台服务器远程重命名为origin,作为默认同步源 git remote rename tmp_b origin # 绑定本地main分支的上游为远程origin的main分支 git branch --set-upstream-to=origin/main main
在tmpB(新服务器2)执行:
git remote remove origin git remote rename tmp_a origin git branch --set-upstream-to=origin/main main
步骤2:变基合并提交,形成线性历史
我们以先保留服务器1的全部提交、再追加服务器2的提交为例:
在tmpB(新服务器2)执行:
# 拉取服务器1的最新提交 git fetch origin # 将本地提交变基到服务器1提交的末尾,保证历史线性 git rebase origin/main
如果变基过程中出现文件冲突,手动修改冲突文件后执行
git add <冲突文件名>,再执行git rebase --continue即可完成变基。
推送合并后的线性历史到服务器1
变基完成后tmpB的提交历史已经是预期的线性结构,直接推送到服务器1即可完成同步:
git push origin main
步骤3:服务器1拉取最新内容完成同步
在tmpA(新服务器1)执行:
git pull
后续使用规范
后续两台服务器开发时,遵循以下流程即可一直保持线性历史双向同步:
- 每次开始修改代码前,先执行
git pull拉取对方的最新提交 - 本地修改完成后commit,再执行
git push推送到对方仓库
如果push时提示提交冲突,说明对方有未同步的新提交,先执行
git pull --rebase合并内容后再push即可。
内容的提问来源于stack exchange,提问作者UlfR
相关产品推荐
相关产品推荐

