首页 > 解决方案 > 同步两个具有不同提交历史的远程 git 存储库

问题描述

我在两个不相关的云位置有两个 git 远程存储库。这些存储库包含不同的提交历史。

我们最终在 Repo2 和 Repo1 中都有一些新代码。但是现在我们希望将代码并行推送到两个存储库。

所以,我的问题是:

标签: gitrepositorybitbucket

解决方案


涉及三个回购:

  1. 第一个远程仓库
  2. 第二个远程仓库
  3. 您的本地仓库副本

由于您可能在本地 PC 上混合了这两个存储库,因此我建议将该存储库目录名称重命名为myrepo.backup或类似名称,并通过执行以下操作重新开始:

  1. 从新Repo1的本地目录克隆(克隆所有分支,而不仅仅是主目录)
  2. 添加Repo2为新遥控器,因此本地仓库有两个遥控器
  3. Repo2.

获取所有内容时,请确保为所有远程存储库创建跟踪分支,应如下所示:

  1. master- 您当地的跟踪参考
  2. Repo1/master- Repo1 上远程 master 分支的跟踪参考
  3. Repo2/master- Repo2 上远程 master 分支的跟踪参考

如果 master 分支在两个 repos 之间出现分歧,它可能看起来像这样:

o-o-o-o-o-o-o-o-o-o-o
       \   \-master  \- Repo1/master  
        \
         \o-o-o-o
                 \- Repo2/master

注意:您可能拥有的不仅仅是一个master分支。这是为了展示一个只有一个分支的示例,但需要为每个分支做出相同的决定。

此时,您将在两个存储库的本地存储库中显示所有历史记录。您需要做的就是决定如何处理分支之间的任何分歧。

选项 1:重命名或标记第二个 repo 中的分支

例如,您可以快进本地master分支以匹配Repo1/master,然后在与具有不同名称的 相同的提交处创建一个本地分支Repo2/master,例如master2如果您希望两个历史继续单独存在。

或者,如果您希望备用分支停止并且不再继续工作,只需添加一个标签而不是使其成为一个分支。它仍然会使用正确的命令推送到 repo,但是标记它可以用来表明它不是应该添加到的实时分支(特别是如果标签类似于END_OF_DUPLICATE_master

选项 2:合并不同的分支

或者,您可以合并Repo2/masterRepo1/master,创建一个新的提交,将 Repo2 中的所有更改合并到 Repo1 主分支,但保留所有历史记录不变,现在有一个合并的主分支。

选项 3:重新设置分歧分支

解决此问题的另一种方法是将 Repo2 主分支重新定位到 Repo1 主分支 - 使用或不使用压缩,具体取决于您是否要保留该特定历史记录。

冲洗并重复

然后对所有其他存在的分支重复相同的决定。最后,确保您将本地分支或标签移至最新提交并呈现给所有现有分支,然后将所有本地分支和标签推回两个存储库,它们将被同步。

现在,说了这么多,我真的强烈建议只拥有一个主仓库。但是,如果由于访问每个 repo 的权限差异或类似情况而需要单独的 repo,我会考虑使用分叉机制(在 Github、Gitlab 上可用,我认为在 Bitbucket 上也可用)。

此外,如果此描述不够清楚,请搜索如何管理分叉存储库中的工作以及如何将origin(分叉)与upstream(原始存储库)同步,因为这或多或少与您的相同正在努力做。


推荐阅读