2016-10-18 18 views
0

私はGitを長い間使っていますが、今日はブランチからブランチへの変更をいくつかマージして問題に遭遇しました。私が持っているこの状況は - 私は4つの枝を持っています:2つの主要なものと2つの特徴のもの。このように呼び出されると仮定しましょう:main_branch1main_branch2feature_branch1feature_branch2フィーチャーブランチは常にmain_branch1から作成され、作業が終了すると、フィーチャブランチにマージされます。そしてある時点で、その変更はmain_branch2に併合されます。 2つのメインブランチの間にマージはありません! ここで問題が発生します。今の私の場合、feature_branch1main_branch1から作成され、内部でいくつかの変更が加えられ、メインブランチに戻されます。その後feature_branch2をもう一度main_branch1から作成し、そこにも変更が加えられ、それを元に戻しました。今度はfeature_branch2main_branch2にマージしたいのですが、私が作成したときに変更したのはfeature_branch1ですから私はgit rebaseでやってみたが、物事が進むことができず、私の働く木は完全な混乱のように見えた。Git - 機能ブランチをマージする方法はありますが、コミットをいくつか除外しますか?

ここ

は私が達成したいもののグラフであり、どのように私のツリーは次のようになります。私はfeature_branch2を作成したときに見ることができるように

o---------------o---------------------o main_branch1 
\   /\     /
    o-----------o \    /
feature_branch1 \    /
        \   /
        o-----------o 
        feature_branch2 \ 
            \ 
            o-----------o main_branch2 

、私はすでにmain_branch1にマージされたfeature_branch1からの変更を、得ました。 feature_branch2main_branch2にマージすると、私はそれらを除外することができますか?しかし、私が後でfeature_branch1main_branch2にマージするときに追加する必要があります...

どうすればいいのでしょうか?ありがとう! :)

答えて

1

rebase --ontoを参照してください。これにより、リベースすることができますが、関係する特定のコミットをさらに制御できます。あなたのケースでは

git rebase --onto <new_base_branch> <old_base_branch> <branch_to_rebase>

、コマンドは次のようなものに見えることがあります。これはmain_branch2をチェックアウトし、一つ一つが、その上にfeature_branch2からコミットを適用

git rebase --onto main_branch2 <hash_of_commit_at_base_of_main_branch2> feature_branch2

を。 feature_branch2main_branch2にマージすることができます。

達成したいと思っていることに沿っていますか?枝の現在の状態の図がなければ、確かに知るのは難しいです!

+0

ええ、私は '--onto'パラメータを調べましたが、実際にどのように役立つのか分かりません。実際には、ブランチからのマージコミットが、feature_branch1にあります。今度は 'feature_branch2'だけを' main_branch2'にマージしたいのですが、 'feature_branch1'からのこのマージコミットはありません。上のグラフは実際にそれを示しています。 – yep4u

1

変更をfeature_branch1から除外したい場合は、作成前に新しいブランチをチェックアウトし、チェリーがfeature_branch2からコミットを選択すると、後で完全にマージできるようになります。

git checkout -b nofeature1 <SHA before feature_branch1> 
git cherry-pick <first SHA feature_branch2>^..feature_branch2 
git checkout main_branch2 
git merge nofeature1 
+0

私は 'main_branch2'にマージするたびに' feature_branch1'の変更を加えずに新しいブランチを作成する必要がありますか? – yep4u

+0

@nogravity開始ポイントが 'main_branch1'であるなら' yes_branch1'があります。それは 'feature_branch1'が履歴にあるからです。私は歴史の中で 'feature_branch1'を使わずに新しいベースブランチを作るほうがいいと思います。さもなければ、あなたは 'main_branch1'に継続的にマージしていくつもりです。そうすれば、他のすべての変更も欲しいと思うでしょうから、毎回git cherry-pick .. main_branch1'のようになります。 –

関連する問題