0

ここに興味深い問題があります... 私のマシンには 2 つの git repro があります。どちらも別のソース管理システムから移行されたもので、最初のものは本来あるべきように変換されていませんでした。2番目のものははるかにうまく機能します。

最初のレプロには、他のレプロに移動したい変更がたくさんあります。コードは 2 つの再現コード間で本質的に同じですが、それらは互いに独立して作成されたため、異なる履歴セットを持ちます。(コードの変更は同じですが、変更番号やその他のメタデータはまったく異なります) コードを新しい git repro に移動するにはどうすればよいですか?

編集:2つのレプロが異なる時点でスタックしているため、ファイルを「コピー」することはできません。私のコードの「壊れた」再現は、過去に永遠に行き詰まっています。

4

1 に答える 1

1

履歴グラフトを実行して、履歴を「古い」リポジトリから新しいリポジトリに移動できるようにすることができます。

リポジトリXのブランチから変更を取得しfoo、それをリポジトリYのマスターに適用するとします。最初に、XをYのリモートとして追加して、両方の履歴を操作できるようにします。

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

両方の履歴が1つのリポジトリにあるので、必要な変更を行うためにチェリーピックを選択できます。履歴が次のようになっているとしましょう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 に答える