履歴グラフトを実行して、履歴を「古い」リポジトリから新しいリポジトリに移動できるようにすることができます。
リポジトリ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
上記)に対応する履歴コミットから分岐し、このブランチにチェリーピックしてから、この一時ブランチをメインラインにマージすることも役立つ場合があります。