如何合并来自两个git存储库的代码,它们在分支中的代码相同,但历史不同?
我有两个项目。一个是原始的OSS项目。我们将错误地称之为“fork”的另一个是原始项目分支的副本 fork中的代码是从Github的源zip导入的。(我非常清楚,这不是你做事情的方式,但我之前的一个团队做了这件事,我现在必须处理这件事。我希望我在做出这一决定时在场,提出反对意见,但这是事实,现在需要妥善解决) 问题是:如何合并来自两个git存储库的代码,它们在分支中的代码相同,但历史不同?,git,Git,我有两个项目。一个是原始的OSS项目。我们将错误地称之为“fork”的另一个是原始项目分支的副本 fork中的代码是从Github的源zip导入的。(我非常清楚,这不是你做事情的方式,但我之前的一个团队做了这件事,我现在必须处理这件事。我希望我在做出这一决定时在场,提出反对意见,但这是事实,现在需要妥善解决) 问题是: fork中的代码包含tag1.2.0的原始项目代码。叉子中的代码位于它的master中 fork具有不属于原始项目的修改 正如可以预料的那样,原来的项目也延续了它的生命,现在已
- fork中的代码包含tag
的原始项目代码。叉子中的代码位于它的1.2.0
中master
- fork具有不属于原始项目的修改
- 正如可以预料的那样,原来的项目也延续了它的生命,现在已经达到了
1.6.0
- (真的)分叉原始项目(及其所有历史)
- 创建一个基于原始
的1.2.0
1.2.0修改的
分支
- 从存储库中获取带有修改的更改,并将其应用于
。(在合并过程中进行了一些手动更改之后,我尝试了重定基址,我能够获得要构建的代码)1.2.0-modified
- 我现在想知道,如果我想继续前进并重新设置到
,最好的做法是什么1.6.0
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 with3
(假设它被标记为v1.3.0
)以处理注释。谢谢!这真是太棒了!那么,现在,如果我想从较新的标签中获得更改,我应该如何继续?在移植的分支上创建一个新分支(比如说1.3.0-modified
),并将其重新定位到标签1.3.0
,或者…?我不明白。如果你已经在原稿的顶端重新设置了叉子的基址,那么你应该已经拥有了原稿中后面标签的所有更改。请参见答案的编辑。
--o--2--o--3--o--o original
\
o--o--o fork