如何合并来自两个git存储库的代码,它们在分支中的代码相同,但历史不同?

如何合并来自两个git存储库的代码,它们在分支中的代码相同,但历史不同?,git,Git,我有两个项目。一个是原始的OSS项目。我们将错误地称之为“fork”的另一个是原始项目分支的副本 fork中的代码是从Github的源zip导入的。(我非常清楚,这不是你做事情的方式,但我之前的一个团队做了这件事,我现在必须处理这件事。我希望我在做出这一决定时在场,提出反对意见,但这是事实,现在需要妥善解决) 问题是: fork中的代码包含tag1.2.0的原始项目代码。叉子中的代码位于它的master中 fork具有不属于原始项目的修改 正如可以预料的那样,原来的项目也延续了它的生命,现在已

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

fork中的代码是从Github的源zip导入的。(我非常清楚,这不是你做事情的方式,但我之前的一个团队做了这件事,我现在必须处理这件事。我希望我在做出这一决定时在场,提出反对意见,但这是事实,现在需要妥善解决)

问题是:

  • fork中的代码包含tag
    1.2.0
    的原始项目代码。叉子中的代码位于它的
    master

  • fork具有不属于原始项目的修改

  • 正如可以预料的那样,原来的项目也延续了它的生命,现在已经达到了
    1.6.0

我想重新开始,做以下几点:

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

  • 创建一个基于原始
    1.2.0
    1.2.0修改的
    分支

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

  • 我现在想知道,如果我想继续前进并重新设置到
    1.6.0
    ,最好的做法是什么

请记住,原始项目和“fork”都有两个变化,所以我希望能够从两个方面保留历史

正确的方法是什么

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

问题是,在对fork的
1.2.0
的更改进行重定后,虽然我确实让它解决了冲突并正确构建了,但当我尝试重新基于
1.6.0
时,它似乎又重新应用了相同的修复,我认为这是因为原始分支不是基于
1.2.0-modified

有没有一个聪明而简单的方法来解决这个问题

fork中的代码包含标记1.2.0的原始项目代码。fork中的代码在它的master中

如果在您的“坏叉”中,初始提交确实与标记1.2.0完全相同,然后在之后,他们开始在其上构建并创建提交,那么它应该太难了,您只需执行以下操作:

git-rebase 1.2.0-modified——改为1.2.0

它将只重新设置您的提交的基础,并且您必须没有冲突

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

如果在没有修改的情况下没有完成初始提交,则必须使用git replace--graft
功能

出现这种情况(时间从左向右流动):

如果您知道分叉历史记录中的第一次提交
X
与提交
2
(假设它被标记为
v1.2.0
)匹配(完全匹配或大部分匹配),您可以使用

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
中标记一些commit with
3
(假设它被标记为
v1.3.0
)以处理注释。

谢谢!这真是太棒了!那么,现在,如果我想从较新的标签中获得更改,我应该如何继续?在移植的分支上创建一个新分支(比如说
1.3.0-modified
),并将其重新定位到标签
1.3.0
,或者…?我不明白。如果你已经在原稿的顶端重新设置了叉子的基址,那么你应该已经拥有了原稿中后面标签的所有更改。请参见答案的编辑。
--o--2--o--3--o--o     original
                  \
                   o--o--o   fork