2017-04-30 14 views
2

私の会社の方針は、プルリクエストがリベースされたブランチで行われなければならないということです。私は地元のDev分岐を有していて、これは「タスク」ブランチがあります。マスターが更新されるとき子ブランチを持つブランチをベースにします。

remote master -------- 
    \ 
    Dev ------------------ 
      \-----task1 \ 
          \---task2 

、私はマスター上のDevをリベース。ブランチtask1とtask2を管理する最適な方法は何ですか?彼らはまだ取り組んでいます。私が見ることができる唯一の方法のように、各タスクブランチをリベースすることが考えられます。

TASK1続けると2が正しく、同様リベースすべき
git checkout Dev 
git rebase --preserve-merges master 

+0

ええ、そうです。マージの代わりにチェリーを選択しない限り、プルリクエストではうまく動作しません。 –

答えて

3

はマージを維持しながらDEVをリベースん最初に試してみてください。

見る「What exactly does git's “rebase --preserve-merges” do (and why?)」タスクの枝をたくさん持っている場合

+0

私はDevにtaskNブランチを定期的にマージしていたので、Devが--preserve-mergesでリベースされている限り、taskNマージはまだ記録されています。 @Bert Fメソッドを適用するような並べ替えのですか? –

+0

@ Josef.B必要はありません:rebase -p masterだけで十分です。私はバートの答えを見ていませんでした(私は唯一の答えでした)。 – VonC

+0

左から右へ、右から左へ、グラフィックを別々に読んでいなければなりません。私はタスク1とタスク2を、リモートマスタから分岐したDevのコミットから分岐した2つの分岐の先端、すなわち3つの分岐ヘッドDev、task1、task2がまだ一緒にマージされていないというヒントとして見る。私はあなたがすでにDevにマージされているtask1とtask2ブランチ、つまり履歴の他の2つのブランチと1つのヘッドを見ていると思います。後者の場合、--preserve-mergesで十分です。それが前者の場合は、単にDevをリベースするだけでは十分ではありません。 –

3

、その後、私は考えることができる最善のは、一時的にタコ一時枝へのDevでそれらをマージして、--preserveでマスターに一時をリベースすることですマージその後、ブランチラベルを適切な場所にリセットします。

$ git checkout -b temp Dev && git merge task1 task2 
$ git rebase master --preserve-merges 
$ git checkout Dev && git reset --hard temp^ 
$ git checkout task1 && git reset --hard temp^2 
$ git checkout task2 && git reset --hard temp^3 
$ git branch -D temp 

それはまだコマンドがたくさんですが、:

  1. ツリーは、本質的に保存されているので、それは手動でグラフを再構築する必要がなくなります、それぞれをグラフトすることから、すなわち少ない人的エラータスクブランチを、再デプロイされたDevブランチの適切な対応するコミットにロードします。 Devとタスクブランチマーカーを正しい親コミットにリセットするだけです。これは、Octopusマージで使用/命名された順序に対応しています。

  2. このようなことをたくさん行う必要がある場合は、スクリプトとエイリアスとして使用するのが簡単です。

+1

2つのブランチしか関与していない場合、マージで--no-ffを使用するように指定するのは正しいでしょうか?私はこれをしてHEAD^2を持っていなかったし、HEAD^2であると予想していたのはHEADだった。 – RoboCop87

+1

@ RoboCop87 - 合意 - マージはできるだけ早送りされます(これは2つのブランチ、つまりDevとtask1があると思われます)。そのため、望ましいマージ動作を保証するためには--no-ffを使用する必要があります。 –

関連する問題