0

这是一个有趣的问题……我的机器上有两个 git repro。它们都从另一个源代码控制系统迁移而来,而第一个源代码控制系统并未完全按照应有的方式进行转换。第二个效果更好。

我在第一个复制中有很多更改,我想转移到另一个。虽然两个 repro 之间的代码基本相同,但它们是彼此独立创建的,因此具有不同的历史记录。(代码更改相同,但更改编号和其他元数据完全不同)如何将我的代码移动到新的 git repro?

编辑:我真的不能只是“复制”我的文件,因为这两个 repro 被困在不同的时间点。我的代码“损坏”的重现永远停留在过去。

4

1 回答 1

1

您可以执行历史移植以允许您将历史从“旧”存储库移动到新存储库。

假设您想从foo存储库 X 中的分支获取更改,并将其应用于存储库 Y 中的 master。首先,让我们将 X 作为远程添加到 Y,以便我们可以操作两个历史记录:

git remote add tmp-X ~/repository-X
git fetch tmp-X

既然这两个历史都在一个存储库中,我们就可以挑选来进行我们想要的更改。假设历史如下所示master

commit 0d39ac6df9f5d6e7b50d670d705fa4aae049b70d
Author: Joe User <user@example.com>
Date:   Sat Oct 13 03:55:24 2012 -0400

    Common parent commit

并在tmp-X/master

commit be79703c19475118b72655d1ea5d1957f3edea58
Author: Joe User <user@example.com>
Date:   Sat Oct 13 03:57:29 2012 -0400

    Another change I want to keep

commit 2a1e95c6cb458718448581664d9f8e6a0b260968
Author: Joe User <user@example.com>
Date:   Sat Oct 13 03:56:00 2012 -0400

    Change I want to keep

commit 0fdda21de3382acb005e9511e6ce95007f20e687
Author: Joe User <user@example.com>
Date:   Sat Oct 13 03:55:24 2012 -0400

    Common parent commit

    [some kind of junk in the commit message that changes the IDs]

那么我们可以git checkout master

git cherry-pick 0fdda21..tmp-X

现在master看起来像:

commit b2246afa547ee52028331d2aa59400bca1265581
Author: Joe User <user@example.com>
Date:   Sat Oct 13 03:57:29 2012 -0400

    Another change I want to keep

commit da36f4b6728aecfd3da7c63d9b1bd430c864858b
Author: Joe User <user@example.com>
Date:   Sat Oct 13 03:56:00 2012 -0400

    Change I want to keep

commit 0d39ac6df9f5d6e7b50d670d705fa4aae049b70d
Author: Joe User <user@example.com>
Date:   Sat Oct 13 03:55:24 2012 -0400

    Common parent commit

如果您在主线中进行了其他更改,您可能还会发现从mainline对应于基本提交(0fdda21上面)的历史提交中分支出来,挑选到该分支,然后将此临时分支合并到主线中会很有帮助。

于 2012-10-13T08:01:13.773 回答