我有两个项目。一个是原始的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
。
有没有解决这个问题的简便方法?
答案 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
功能