2012-09-10 17 views
29

私は、誤って別の機能ブランチからマスターから2番目の機能ブランチを作成するのではなく、1つの機能ブランチを作成した同僚を手助けしようとしています。ここで私は考えgitブランチを2つのブランチに分割しますか?

Master ---A---B---C 
        |\ 
      Foo | E---F---F---H 
        | 
      Bar J---K---L---M 

一つの方法は、FooV2とBarV2ブランチを作成すること、およびcherry-でしょう... ...我々が今持っているもの、実質的に

Master ---A---B---C 
        \ 
       Foo E---F---F---H 
           \ 
          Bar J---K---L---M 

であり、ここで私たちが持っているしたいものです個々のコミットを適切なV2ブランチに選択します。しかし、私は興味があります、この状況に対処する良い方法はありますか?

答えて

12

は、それはあなたはできるように私には見えます:

git checkout J 
git rebase master 

編集:

私は私が提案し、それが動作しないものを試してみました。 knittlの提案は機能しません(私の箱に)。ここでは、私のために仕事をやったことだ:

git rebase --onto master foo bar 
+2

ありがとうございました。編集されたバージョンはうまくいった! これ以上の詳細が必要な人は、Pro Gitの「もっと興味深いRebase」というセクションがあります。このセクションは、ほとんどこの正確な例をカバーしています:http://git-scm.com/book/en/Git-Branching- Rebasing –

+1

'git rebase --onto master foo bar'は以下を意味します:" foo "を使わずに" bar "を取り出してマスターに置きます。 – schoetbi

6

あなたがマスターにあなたのバーブランチをリベースすることができます

git rebase --onto C H M 

いくつかのパッチが競合した場合は、手動でそれらを解決する必要がある(しかし、あなたはまた、桜が選ぶときことをしなければなりません)。注意の言葉:歴史が既に公表されているときには再分配しないでください。

57

私たちは単に「このコマンドを実行する」よりも少しより良いものを理解するのに役立ちます、より一般的な答えのために、我々はより大きな例が必要。それでは、あなたがこのような状況では、実際にしているふりをしてみましょう:

---A---B---C <= Master 
      \ 
      E---F---F---H <= Foo 
          \ 
          J---K---L---M <= Bar 
             \ 
             N---O---P---Q <= Baz 

そしてここでは、私たちが持っているしたいものです...

ありがたい
---A---B---C <= Master 
      |\ 
      | E---F---F---H <= Foo 
      |\ 
      | J---K---L---M <= Bar 
      \ 
      N---O---P---Q <= Baz 

を、Gitはのオプションで、私たちのためのソリューションを持っていますrebaseコマンド! - 何か

  • --ontoの親を変更する - これは、この代替リベースの構文を使用するのgitに伝えるフラグです

    1. rebase:この手段はパーツに分けることができ何

      git rebase --onto [newParent] [oldParent] [branchToMove] 
      

    2. newParent - リベースするブランチが親として持つブランチ
    3. oldParent - これは、それが親
    4. branchToMoveだとして、あなたがリベースしている枝が現在持っている枝である - これはあなたが動いている枝(リベース)である

    ビット「古い親ブランチ」についてのことができますちょっと混乱するかもしれませんが、本当にやっていることは、「リベースを行うときに私の古い親からの変更を無視してください」ということです。 oldParentは、移動している支店(つまり、branchToMoveがどこにあるかを定義する方法です。です。

    私たちの状況で実行するコマンドは何ですか?

    git rebase --onto Master Bar Baz 
    git rebase --onto Master Foo Bar 
    

    私たちは、「ブランチ・チェーン」の終わりのオフ各ブランチをプルする必要があるため、これらのコマンドの順序が重要であることに注意してください。

  • +3

    可能な限り最良の方法ですべての魔法を取り除きます。これを使用して、Fooでいくつかの作業を行ったフィーチャーブランチをun fubar(baz)にしてから、Barに向かってコミットし、さらにFooでコミットしますが、すべて同じコミットラインにあります。 #fail –

    +1

    優れた答え。 –

    +0

    @cdeszaq私は編集しようとしましたが、何が起こったのかわかりません。最初のダイアグラムには、最初のダイアグラムが残りの答えと元の質問と一致するように "Foo"でなければなりません。 – ryanwils

    関連する問題