私は、2 つの並行した(ただし現在は実験的な)開発ブランチを持つ新しいプロジェクトで Git を使用しています。
master
: 既存のコードベースのインポートと、概ね確信しているいくつかの変更exp1
: 実験ブランチ #1exp2
: 実験ブランチ #2
exp1
これらは 2 つの非常に異なるアーキテクチャ アプローチをexp2
表しています。さらに作業を進めなければ、どちらが機能するか (またはどちらかが機能するか) はわかりません。1 つのブランチで作業を進めていくと、他のブランチでも役立つ編集内容が見つかることがあり、その編集内容だけをマージしたい場合があります。
他のすべてを残しながら、ある開発ブランチから別の開発ブランチに選択的な変更をマージする最適な方法は何ですか?
私が検討したアプローチ:
git merge --no-commit
次に、ブランチ間で共通にしたくない多数の編集を手動でステージング解除します。共通ファイルを一時ディレクトリに手動でコピーし、その後
git checkout
他のブランチに移動し、さらに一時ディレクトリから作業ツリーに手動でコピーします。上記のバリエーションです。
exp
今のところはブランチを放棄し、実験用に 2 つの追加のローカル リポジトリを使用します。これにより、ファイルの手動コピーがはるかに簡単になります。
これら 3 つのアプローチはどれも面倒でエラーが発生しやすいようです。フィルター パス パラメーターに似た、より選択性の高い、より優れたアプローチがあることを期待していますgit-merge
。
ベストアンサー1
要約
git checkout source_branch -- path/to/file
# resolve conflicts if any
git commit -am '...'
私も上で述べたのと同じ問題を抱えていました。しかし、これ答えをより明確に説明します。
まとめ:
マージしたいブランチからパスをチェックアウトし、
$ git checkout source_branch -- <paths>... Hint: It also works without `--` like seen in the linked post.
または、選択的にハンクをマージする
$ git checkout -p source_branch -- <paths>...
あるいは、リセットを使用してからオプションを追加し-p
、
$ git reset <paths>...
$ git add -p <paths>...
最後にコミット
$ git commit -m "'Merge' these changes"