機能ブランチを別の機能ブランチにリベースする


305

私が取り組んでいる(プライベート)機能ブランチが2つあります。

a -- b -- c                  <-- Master
     \     \
      \     d -- e           <-- Branch1
       \
        f -- g               <-- Branch2

これらのブランチで作業した後、Branch1のBranch2からの変更が必要であることを発見しました。Branch2の変更をBranch1にリベースしたいのですが。最終的には次のようになります。

a -- b -- c                  <-- Master
           \
            d -- e -- f -- g <-- Branch1

私は2番目のブランチ最初のブランチリベースする必要があると確信していますが、正しい構文とどのブランチをチェックアウトする必要があるかは完全にはわかりません。

このコマンドは望ましい結果を生成しますか?

(Branch1)$ git rebase --onto Branch1 Branch2

11
あなたの質問に答えるために、私はテストリポジトリを作成し、あなたが示したコミット構造を作成し、あなたが示したコマンドを試します。しかし、私はあなたがそれを自分で行うことができると思うので、私はそれをするつもりはありません:)
Daniel Hilgarth

3
ありがとう。私はこれを最初に正しく理解することにとても夢中だったので、自分で簡単にテストすることはできなかった:-)
Arjen

4
私はそう思ったので、そのコメントを投稿しました:)私が何かをするたびに、それが自分のやると思っていることを実行するかどうか確信がない場合は、テストリポジトリを作成し、そこでテストを実行します。または、実際のリポジトリのコピーを作成し、そのコピーに対してテストを実行します。
Daniel Hilgarth、2013

注:Git 2.0では、この種のリベースのショートカットが導入されgit rebase -ます:。以下の私の回答を
VonC

5
マイナーノート:ここでの答えは結果としてbranch2を与えます。OPはブランチ1を必要としていました。または私は何かを逃しましたか?
Josef.B 2017

回答:


353
  1. Branch2に切り替え

    git checkout Branch2
    
  2. 現在の(Branch2)の変更をBranch1の変更の上に適用し、Branch2のままにします。

    git rebase Branch1
    

これにより、Branch2で望ましい結果が得られます。

a -- b -- c                      <-- Master
           \
            d -- e               <-- Branch1
           \
            d -- e -- f' -- g'   <-- Branch2

Branch1を削除できます。


ありがとう!リベース後にブランチを削除すると、ブランチが完全にマージされていないというメッセージが表示されます。このメッセージを無視して強制的に削除できると思いますか?
Arjen

10
彼はBranch1にすべての変更を加えたくありませんでしたか?
tomasz_kusmierczyk 2018年

6
これは彼が欲しかったものの反対のように思われますか?
1252748

1
確かに、@ tomasz_kusmierczykと@ 1252748、そして私も混乱しました。しかしgit rebase、Branch1にとどまっている間に実行すると、Branch1の履歴が書き直され、Branch2からコピーされた変更に加えて、Branch1の変更が反映されることがわかりました。その結果、次のコミット順序になりa - b - f - g - c' - d' - e'ます。
eel ghEEz

1
@tomasz_kusmierczykと1252748、これは彼が望むものの反対ではなく、これはまさに彼が望んだものです。ブランチ名は関係ありません。いつでも変更できます。
a3y3

56

注:を使用している場合Branch1は、Git 2.0(2014年第2四半期)で次のように入力できます。

git checkout Branch2
git rebase -

Brian Gesiakによるコミット4f40740を参照してください。modocache

rebase-前のブランチの" "省略形を許可する

Teach は、現在のブランチのブランチcheckoutと同じmerge名前を付け、そのブランチをリベースrebaseします。つまり、「-」は「以前に所属していたブランチ」を意味します。


26
いいですが、少し危険でもあります。時には冗長性が優先されます。でも、私もJavaが好きです...(-:
sthzg 2017

3

あなたがリベースを要求したのは知っていますが、代わりにBranch2からBranch1に移動したいコミットをチェリーピックします。そうすれば、masterからどのブランチが作成されたのかを気にする必要がなくなり、マージをより細かく制御できるようになります。

a -- b -- c                  <-- Master
     \     \
      \     d -- e -- f -- g <-- Branch1 (Cherry-Pick f & g)
       \
        f -- g               <-- Branch2
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.