如何合并两个git存储库中分支代码相同但历史记录不同的代码?

时间:2019-06-12 13:39:25

标签: git

我有两个项目。一个是原始的OSS项目。我们将其错误地称为“ fork”的另一个是原始项目分支的副本。

fork中的代码是从Github的源zip导入的。 (我非常清楚,这不是您的工作方式,而是我之前的一个团队做到了,现在我必须解决这个问题。我希望在做出此决定时建议我这样做是对的,但事实就是如此,现在需要正确修复。)

问题:

  • 分支中的代码包含标签1.2.0的原始项目的代码。分支中的代码位于master中。

  • 该分叉具有的修改不属于原始项目。

  • 可以预见的是,原始项目也已继续存在,并且现已达到1.6.0版本。

我想重新开始并执行以下操作:

  • (真的)分叉原始项目(及其所有历史记录)。

  • 创建一个基于原始1.2.0-modified的{​​{1}}分支。

  • 通过修改从存储库中获取更改,并将其应用于1.2.0。 (我尝试过重新设置基准,在合并过程中进行了一些手动更改之后,我能够获取要构建的代码。)

  • 现在,我想知道最好的行动方法是什么,如果我想继续前进并以1.2.0-modified为基础。

请记住,原始项目和“ fork”都进行了更改,所以我希望能够保留双方的历史记录。

执行此操作的正确方法是什么?

很明显,我已经将两个遥控器添加到新的fork中以进行修改,并且已经将它们都获取了。

问题是,在根据分叉的1.6.0重新设置更改后,虽然确实可以解决冲突并正确构建,但是当我尝试重新基于1.2.0时,似乎再次重新应用相同的修补程序,我认为这是因为原始分支不是基于1.6.0

有没有解决这个问题的简便方法?

2 个答案:

答案 0 :(得分:3)

您遇到这种情况(时间从左到右):

--o--2--o--3--o--o     original

       X--o--o--o      fork

如果您知道分叉历史记录中的第一个提交X与(完全或大部分)匹配2(假设已标记为v1.2.0)匹配,则可以将历史记录与< / p>

git replace --graft X v1.2.0

这会创建以下虚假历史记录:

--o--2--o--3--o--o     original
      \
       X--o--o--o      fork

现在,您可以轻松地使用git rebase将更改与原始历史记录联系起来。您会得到:

--o--2--o--3--o--o     original
                  \
                   o--o--o   fork

现在您可以使用git replace -d删除嫁接了(尽管我不确定如何使用此版本)。


编辑:在original中用3标记了一些提交(假定已标记为v1.3.0)以解决评论。

答案 1 :(得分:2)

  

fork中的代码包含标签1.2.0的原始项目的代码。分支中的代码在其母版中。

如果在您的“不良分支”中,初始提交确实与标记1.2.0完全相同,然后与 AFTER 完全相同,则他们开始在其上进行构建并创建提交,则应在太困难了,您只需要执行以下操作即可:

git rebase <hash_of_root_commit> 1.2.0-modified --onto 1.2.0

它只会使您的提交变基,并且您必须没有冲突。

在那之后,您应该拥有一个分支,以便您可以“轻松地”将其立足于1.6.0(我想是有冲突的……)

如果随后未经修改未完成初始提交,则必须使用git replace --graft功能