2016-05-14 11 views
3

フィーチャーブランチ(マスターから分岐)を別のブランチの特定のコミットにリベースしようとしています。 私の初期ステータスは、以下のフィーチャーブランチを別のブランチの特定のコミットにリベースする

 C -- D   branch1 
    / 
A -- B -- E -- F   master 
       \ 
         branch2 (zero commits after creating the branch) 

だった私が最初にうまく働いているマスターで上にBRANCH2をリベース。 (私の理解によれば)必要があります私の現在のステータスは、次

 C -- D    branch1 
    /
A -- B -- E -- F   master 
\ 
    B -- E -- F    branch2 

も私はAをコミット時にマスターのオフそのBRANCH2の枝を検証しても、masterブランチです。私は今取得したいことは、この

A -- B -- E -- F   master 
\ 
    B -- E -- F    branch2 
    \ 
    C -- D    branch1 

である私は

git checkout branch1 
git rebase --onto B branch2 

を試してみました。しかし、これは紛争の全体の束をもたらし、私はこれらが発生するか、まったく理解していません。たぶん、私はリベースがしていることを完全に誤解していますか?

注:branch1をbranch2のBに正常にリベースした後、masterをAにリセットする予定ですので、最終バージョンは次のように見えます。

A     master 
\ 
    B -- E -- F  branch2 
    \ 
    C -- D   branch1 
+3

'master'を' A'にリセットしないのはなぜですか?あなたは何を達成しようとしていますか? – PetSerAl

+0

'master'をリセットした場合、' branch1'はどうなりますか?私は 'branch2'を使ってステージング/開発ブランチを確立しようとしています。そして現在マスターされているバージョンに' master'をリセットしようとしています。 – denise

+1

Gitブランチではコミットするポインタです。したがって、 'master'ポインタを動かすと、' branch1'ポインタは以前と同じコミットを指しています。 – PetSerAl

答えて

3

あなたの前提にいくつかの問題があります。まず、ブランチはコミットのポインタに過ぎません。あなたはこれで始まり、masterがチェックアウトされています。

 C -- D  branch1 
    / 
A -- B -- E -- F master 

git branch branch2の後にこれがあります。

 C -- D  branch1 
    / 
A -- B -- E -- F master & branch2 

注意、masterbranch2別として、その名前からFで両方の点なしスタブの分岐が存在しない、彼らは区別できません。

チェックアウトしたらbranch2git rebase Aは何も変わりません。 branch2はすでにその祖先にAを持っていますが、それはFを指しています。 Current branch branch2 is up to dateのようなメッセージを受け取ったはずです。

あなたがgit checkout branch1git rebase --onto B branch2を行ったとき、これは混乱していました。仮定されている第3引数、現在チェックアウトされているブランチがあります。あなたが実際に走ったのはgit rebase --onto B branch2 branch1です。それは、ブランチ1で到達可能なコミットを受け取りますが、ブランチ2ではなく(git log branch2..branch1またはCとDと同じです)、Bに入れます。これはノーオペレーションでなければなりませんが、branch1とbranch2に共通の変更がある場合、rebaseはそれらを破棄します。

CとEが同じ変更を加えた場合、これに巻き込まれて、おそらく競合が発生する可能性があります。

 C -- D  original branch1 
    / 
A -- B -- E -- F master & branch2 
     \ 
     D1 branch1 

これはあまり意味がありませんが、2つのいとこの間でリベースしようとするとどうなりますか。

また、リベースされたブランチのIDはD1ではなく、Dであることに注意してください。コミットIDには親のIDが組み込まれているため、IDを変更する必要があります。 rebaseは履歴を書き換えないので、新しい履歴を作成して、それがいつものように伝えます。微妙だが重要な区別。あなたの元のコミットはまだそこにあります...しばらくの間。


あなたはここから行きたい場合は:これに

 C -- D  branch1 
    / 
A -- B -- E -- F master & branch2 

A     master 
\ 
    B -- E -- F  branch2 
    \ 
    C -- D   branch1 

これは、それがあなたがよくしているものと一致するように反転することができます。

 C -- D  branch1 
    / 
    B -- E -- F branch2 
    /
    A    master 

あなたがする必要があるのは、これを行うには、いくつかの方法がありますA.へmasterを移動する1がgit branch -f master Aです。これにより、masterAに移動します。