ブランチから別のブランチへの単一のコミットをチェリーピックしたいと思います。ファイルの名前変更は非常に一般的だと思いますが、それでも人間の介入なしに変更を適用できるようにしたいと考えています。
組み込みの cherry-pick コマンドは、特に名前が変更されたファイルへの変更と組み合わされた場合に、名前の変更を検出するように縫い付けられていないため (少なくとも私のテスト ケースでは)。
少し試してみたところ、最終的に 2 つのリベース操作を含む解決策にたどり着きました。
チェリーピックを適用したいコミットを指すターゲットという名前のブランチがあるとしましょう。チェリーピックしたいコミットは、sourceという名前のブランチによって指されています。
次に、次のコマンドを実行します。
- source と同じコミットを指すブランチ sourceTemp を作成します (ブランチ source を保持したいため)
git rebase --strategy="recursive" --strategy-option="rename-threshold=30" target sourceTemp
(おそらく別のしきい値を使用します。テストファイルは非常に小さいため、変更は比較的大きくなります)git rebase --onto target sourceTemp~ sourceTemp
これは、ブランチsourceからtargetへの最後のコミットによって導入された変更のみを適用します。
また、テストを github に置きました。
https://github.com/fraschfn/cherry-pick
私が知りたいのは、このアプローチが実現可能かどうか、または私の単純なテスト設定でのみ機能するかどうかです!
更新:代替方法
sourceとtargetのマージ ベースにパッチをリベースします。
開始状況
A - B <--- target
/
M
\
C - D <--- source
DをBにチェリーピックしたい.
新しいブランチパッチを作成した後、D を M にリベースします
A - B <--- target / M - D' <--- patch \ C - D <--- source
ソースの置換を取得するために C と D' をマージします
B と D' をマージして、ターゲットのパッチを適用したバージョンを取得します
A - B <--- target / \ / E <--- patched target / / M - D' <--- patch \ \ \ F <--- new source (same snapshot as source different history) \ / C - D <--- source (will be discarded)
利点は、E と F を問題なくマージできるようになったことです。別の方法: 階層のできるだけ早い段階でパッチを含めて、D を作成せずに直接 D' を作成し、リベースを保存します。
以前のバージョンより上の利点は、「新しいソース」と「パッチを適用したターゲット」の 2 つのブランチをマージでき、それが機能し (もちろんソースとターゲットのマージが機能する場合)、git が認識しているため、同じ変更セットを 2 回導入しないことです。変更セットを両方のブランチに導入したマージ操作が原因です。