1. ホーム
  2. git

[解決済み] Git で、別のブランチの変更を選択的にマージしたり選択したりするにはどうすればよいですか?

2022-03-20 09:12:30

質問

新しいプロジェクトで Git を使っているのですが、そのプロジェクトには二つの並行した -- しかし現在は実験的な -- 開発ブランチがあります。

  • master : 既存のコードベースのインポートと、私が概ね確信しているいくつかの修正。
  • exp1 実験用ブランチ #1
  • exp2 実験用ブランチ #2

exp1exp2 は、2つの全く異なるアーキテクチャのアプローチを表しています。もっと先に進むまで、どちらがうまくいくのか(もしどちらかであったとしても)知る由もないのです。一方のブランチで作業を進めるうちに、もう一方のブランチでも役に立つような編集をすることがあるので、そのようなものだけをマージしたいと思っています。

ある開発ブランチから別の開発ブランチへ、選択的な変更をマージし、他のすべてを残すための最良の方法は何でしょうか?

私が考えたアプローチ

  1. git merge --no-commit その後、ブランチ間で共通化したくない大量の編集を手動でアンステージしています。

  2. 共通ファイルを一時ディレクトリに手動でコピーし、その後に git checkout を使用して別のブランチに移動し、さらに手動で一時ディレクトリから作業ツリーにコピーしています。

  3. 上記のバリエーションです。を放棄して exp ブランチを使用し、実験的に2つのローカルリポジトリを追加で使用します。 こうすることで、手動でのファイルのコピーがより簡単になります。

これら3つのアプローチは、いずれも面倒でミスが起こりやすいように思います。 もっといい方法があるといいのですが、フィルターパスのパラメーターのようなもので git-merge をより選択的にすることができます。

解決方法は?

を使用します。 チェリーピック コマンドを使用すると、ひとつのブランチから個々のコミットを取得できます。

もし欲しい変更が個々のコミットに含まれていない場合は、ここで紹介する方法を使って コミットを個々のコミットに分割する . 大まかには git rebase -i を使用して編集する元のコミットを取得し、次に git reset HEAD^ で選択的に変更を取り消し、次に git commit を使えば、その部分を新しいコミットとして履歴に残せます。

もう一つの素晴らしい方法がここにあります は、Red Hat Magazine の中で git add --patch または、場合によっては git add --interactive これは、異なる変更を個々のファイルに分割したい場合、ハンクの一部だけを追加することができます (このページで "split" を検索してください)。

変更点を分割したことで、必要な変更点だけを選び出すことができるようになりました。