git - 同步两个具有不同提交历史的远程 git 存储库
问题描述
我在两个不相关的云位置有两个 git 远程存储库。这些存储库包含不同的提交历史。
- Repo1 是首先创建的,我们首先开始使用它。
- 后来创建了 Repo2,我们在 Repo1 中所做的所有更改都被推送到了 Repo2。
我们最终在 Repo2 和 Repo1 中都有一些新代码。但是现在我们希望将代码并行推送到两个存储库。
所以,我的问题是:
- 我们如何让两个 repos 的提交历史同步,以便我们可以继续使用 git push 命令同时推送到两个遥控器而不会感到很痛苦?
解决方案
涉及三个回购:
- 第一个远程仓库
- 第二个远程仓库
- 您的本地仓库副本
由于您可能在本地 PC 上混合了这两个存储库,因此我建议将该存储库目录名称重命名为myrepo.backup
或类似名称,并通过执行以下操作重新开始:
- 从新
Repo1
的本地目录克隆(克隆所有分支,而不仅仅是主目录) - 添加
Repo2
为新遥控器,因此本地仓库有两个遥控器 - 从
Repo2
.
获取所有内容时,请确保为所有远程存储库创建跟踪分支,应如下所示:
master
- 您当地的跟踪参考Repo1/master
- Repo1 上远程 master 分支的跟踪参考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/master
到Repo1/master
,创建一个新的提交,将 Repo2 中的所有更改合并到 Repo1 主分支,但保留所有历史记录不变,现在有一个合并的主分支。
选项 3:重新设置分歧分支
解决此问题的另一种方法是将 Repo2 主分支重新定位到 Repo1 主分支 - 使用或不使用压缩,具体取决于您是否要保留该特定历史记录。
冲洗并重复
然后对所有其他存在的分支重复相同的决定。最后,确保您将本地分支或标签移至最新提交并呈现给所有现有分支,然后将所有本地分支和标签推回两个存储库,它们将被同步。
现在,说了这么多,我真的强烈建议只拥有一个主仓库。但是,如果由于访问每个 repo 的权限差异或类似情况而需要单独的 repo,我会考虑使用分叉机制(在 Github、Gitlab 上可用,我认为在 Bitbucket 上也可用)。
此外,如果此描述不够清楚,请搜索如何管理分叉存储库中的工作以及如何将origin
(分叉)与upstream
(原始存储库)同步,因为这或多或少与您的相同正在努力做。
推荐阅读
- laravel - 我写了“composer require larabook/gateway”来安装软件包,但我收到了这个错误
- c# - 我如何使用 Visual Studio 内置数据库而不是这些硬编码数据来进行级联下拉菜单?
- python - 如何在 solaris 上从源代码构建 64 位 python
- javascript - 根据 javascript 中的值显示下拉菜单
- php - 更改幻灯片的图像,CKFinder 是最好的解决方案吗?
- kotlin - RxJava:忽略 Flowable 中的一些错误
- reactjs - 找不到入口模块中的错误 - 在 Webpack 配置文件中
- javascript - 元素对象 (JavaScript) 与元素 (HTML)
- c++ - 如何在头文件的类中声明二维数组
- ios - xcode10.1 更新后致命错误 NSArray 元素无法匹配 Swift Array 元素类型