将两个相似的远程Git仓库合并为一个

15

我已经进行了一些搜索并阅读了一个git书籍以及一些网络上的地方,比如git by example,但是我无法找到正确的方法来实现这个功能。

我有两个位于不同机器上的git仓库。每个仓库都保存了一个程序的配置。当您比较这两个仓库时,某些部分的配置是相同的,而某些部分则不同。

我们想要做的是创建一个第三个仓库,并将另外两个仓库的内容合并到这个新仓库中。我希望通过这样做,能够拥有一个仓库包含了来自其他两个仓库的所有数据,但只保留一个副本。这样,我们希望git能告诉我们两个仓库之间的差异,并将这些更改合并成一个仓库。

希望这很容易理解。

我尝试创建一个新的git仓库,对其中一个服务器进行git clone,创建一个新分支,然后对另一个仓库进行git clone,然后要求git将它们合并。我还尝试了子树合并,但都没有得到我想要的结果。

第一个示例简单地说是删除所有文件并添加一堆新文件。这不是我们想要的,我们希望有一个单独的git仓库,它包含了从两个远程仓库合并而来的配置的单个副本。

如果有人能帮助解决这个问题,将不胜感激。

顺便说一下,两个仓库的数据都由相同文件名的相同文件组成,但内容略有不同。


1
听起来你需要创建一个人工共同祖先,将两个仓库的历史记录重新定位/移植到它上面,然后合并这两个分支。 - Cascabel
1
可能是重复的问题:如何合并两个远程仓库 - karlphillip
3个回答

21
假设我们假定仓库名称为A和B,您可以首先将A或B中的任何一个克隆到C中:
$ git clone git://path/to/A.git

现在C与A完全相同(而A是C的起点)。我们现在可以将B添加为C的远程仓库并创建一个跟踪分支masterB以跟踪B的主分支:

$ git remote add B git://another/path/to/B.git
$ git fetch B
$ git checkout --track masterB B/master

现在C的主分支与A的主分支相同,而masterB分支与B上的master相同。我们现在可以将masterB合并到master中:

$ git checkout master
$ git merge masterB
$ .. solve conflicts

除非你需要追踪原始存储库,否则我们可以使用以下命令进行清理:

$ git remote rm origin
$ git remote rm B
$ git branch -d masterB

1
+1 工作得非常好。不过有一件事,git checkout --track... 失败了,出现了致命的缺少分支错误。我改用了 git checkout -b masterB B/master,看起来工作正常。 - arunkumar

0

你将会有两个不同的分支来自这两个仓库。假设它们是:

repo1/master
repo2/master

此时,我会将它们合并并解决冲突,以便它代表其中一个仓库。然后,我会再次进行合并,并在出现任何冲突的情况下选择另一个仓库作为主仓库。现在你就有了:

common1
common2

分支。使用“ours”策略将common2合并到common1中。现在对另一个进行相同操作。这将捕获历史上的共同点,并防止配置差异在后续合并中引起问题。这本质上是让一个分支视另一个为开发分支。

希望这可以帮助到您。


问题在于,如果所有文件都相同,事情会变得非常冲突。 - Cascabel

0

把两个相似的仓库合并成一个很简单。

  1. 创建一个空仓库

  2. 将远程仓库1添加到空仓库

  3. 将远程仓库1的主分支合并到空仓库

  4. 将远程仓库2添加到空仓库

  5. 将远程仓库2的主分支合并到空仓库

  6. 移除远程仓库1和仓库2的关联

  7. 将空仓库推送到服务器上。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接