同步两个具有不同提交历史记录的远程git存储库

时间:2020-07-08 20:26:54

标签: git repository bitbucket

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

  • Repo1首先创建,我们首先开始工作。
  • 后来创建了Repo2,并将我们在Repo1中所做的所有更改都推送到了Repo2。

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

所以,我的问题是:

  • 我们如何同步获取两个存储库的提交历史记录,以便继续使用git push命令同时向两个远程服务器进行推送?

1 个答案:

答案 0 :(得分:0)

涉及三个回购协议:

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

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

  1. Repo1克隆到新的本地目录(克隆所有分支,而不仅仅是母版)
  2. 添加Repo2作为新的远程服务器,因此本地存储库具有两个远程服务器
  3. Repo2获取所有内容。

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

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

如果master分支在两个存储库之间分叉,则可能看起来像这样:

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

注意:您可能不仅拥有master分支。旨在显示仅包含一个分支的示例,但是需要为每个分支做出相同的决定。

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

选项1:从第二个存储库中重命名或标记分支

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

或者,如果您希望替代分支停止并且不被进一步处理,则只需添加标签而不是使其成为分支即可。仍然会使用正确的命令将其推送到存储库,但是标记它可以用来表明它不是应该添加的实时分支(尤其是如果标记为END_OF_DUPLICATE_master之类的话)

选项2:合并分散的分支机构

或者,您可以将Repo2/master合并到Repo1/master中,创建一个新的提交,该提交将所有从Repo2进行的更改合并到Repo1 master分支中,但是保留所有历史记录,并且现在有了一个合并的master分支。

选择3:为分歧分支重新定位

解决此问题的另一种方法是将Repo2 master分支重新建立到Repo1 master分支上-是否压缩,取决于您是否要保留该特定历史记录。

冲洗并重复

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

现在,所有这一切,我真的强烈建议您仅拥有一个主要仓库。但是,如果由于权限差异而需要单独的存储库,则谁可以访问每个存储库之类的东西,我会考虑使用分叉机制(在Github,Gitlab和Bitbucket上可用)。

如果此描述不够清楚,请搜索如何管理叉式存储库中的工作以及如何将origin(分支)与upstream(原始存储库)同步),因为这与您尝试执行的操作大致相同。