git - 如何 merge 来自分支中代码相同但历史不同的两个 git 存储库的代码?

标签 git

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

fork 中的代码是从 Github 的源代码 zip 导入的。 (我非常清楚这不是你做事的方式,但我之前的一个团队这样做了,我现在必须处理后果。我希望在做出这个决定时我在身边反对它, 但它就是这样,现在需要正确修复)。

问题:

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

  • fork 包含不属于原始项目的修改。

  • 可以预料,原来的项目也继续它的生命,现在已经达到版本 1.6.0

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

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

  • 创建一个基于原始 1.2.01.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/

相关文章:

git - 为什么 git 标签没有出现在任何分支上?

git - `git stash show -p stash@{N}` 和 `git show stash@{N}` 之间的区别?

git - ssh : connect to host gitlab. com 端口 22:连接超时

git - 使用 git 在 Android Studio 项目上进行协作

git - 如何在没有 git clean 的情况下删除 GIT 中未跟踪的文件

git - 在 ignoreLowercase=True 时将 git 中的目录重命名为小写的问题

git - 如何正确配置涉及 github 和 bitbucket 的多个远程帐户的 ssh key ?

git - Git 中 merge 和提交的混淆

git:当git没有注意到冲突时如何手动 merge 文件

git - 处理大型 Git 项目的子树