我有两个项目。一个是原来的OSS项目。另一个我们会错误地称为“fork”的是原始项目分支的副本。
fork 中的代码是从 Github 的源代码 zip 导入的。 (我非常清楚这不是你做事的方式,但我之前的一个团队这样做了,我现在必须处理后果。我希望在做出这个决定时我在身边反对它, 但它就是这样,现在需要正确修复)。
问题:
fork 中的代码包含标签
1.2.0
的原始项目代码。 fork 中的代码在它的master
中。fork 包含不属于原始项目的修改。
可以预料,原来的项目也继续它的生命,现在已经达到版本
1.6.0
。
我想重新开始并执行以下操作:
(真的) fork 原始项目(及其所有历史记录)。
创建一个基于原始
1.2.0
的1.2.0-modified
分支。从存储库中获取更改和修改并将它们应用到
1.2.0-modified
。 (我已经尝试过 rebase ,在 merge 期间进行一些手动更改后,我能够获取要构建的代码)。如果我想继续前进并 rebase 到
1.6.0
,我现在想知道最好的行动方案是什么。
请记住,原始项目和“ fork ”都发生了变化,所以我希望能够保留双方的历史记录。
执行此操作的正确方法是什么?
显然,我已经将两个 Remote 都添加到新的 fork 中进行修改,并且我已经获取了它们。
问题是,在对分支的 1.2.0
的更改进行 rebase 之后,虽然我确实解决了冲突并正确构建,但当我尝试 re-based 到 1.6 时.0
,它似乎再次重新应用相同的修复程序,我认为这是因为原始分支不是基于 1.2.0-modified
。
有没有聪明而简单的方法解决这个问题?
最佳答案
你有这种情况(时间从左到右流动):
--o--2--o--3--o--o original
X--o--o--o fork
如果你知道第一次提交 X
在你的 fork 历史匹配(完全或大部分)提交 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
中标记了一些提交与 3
(假设它被标记为 v1.3.0
)来处理评论。
关于git - 如何 merge 来自分支中代码相同但历史不同的两个 git 存储库的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56563627/