2016-07-28 60 views
1

犯我有2個分支機構,說「branch_1」和「branch_2」像這樣:如何挑選一份修正了另一個分支

A <--master 
\ 
B <--branch_1 
    \ 
    C <--branch_2 

現在我在做一個branch_1變化和修改HEAD提交。所以,現在的設置是這樣:

A <--master 
|\ 
| B_amended <--branch_1 
| 
B---C <--branch_2 

上branch_1顯示了git的日誌提交B_amended在頭頂承諾A.對branch_2顯示了git的日誌提交B和C的頭頂提交A的提交乙在branch_2上不包含在branch_1上提交B_amended的修改更改。

我的問題是:如何將B_amended帶入branch_2,使其看起來像這樣?

A <--master 
\ 
B_amended <--branch_1 
    \ 
    C <--branch_2 

現在我做:

$ git checkout branch_2 
$ git reset --soft HEAD~ 
$ git stash 
$ git rebase branch_1 
$ git stash apply 
$ git commit 

有沒有更好的方法?

+0

當你修改'B'時,它是否修改它的歷史記錄?換句話說,你的問題真的有必要嗎? –

+0

我不明白你的圖表。爲什麼有多個'A's和'B's?另外,在修改'B'(實際上創建一個新的'B_amended')之後,'C'不會神奇地將'B_amended'作爲父項。你能澄清嗎? – Svante

+0

是的,我看到了,只是認爲這是一個錯誤,B掛掉了A和C關閉B. – DavidN

回答

-1

我沒有找到一個更好的方法:做一個互動的rebase和從「branch_2」中刪除提交「B」。

所以 「B_amended」 中的 「branch_1」 後,請執行下列操作:

$ git checkout branch_2 
$ git rebase branch_1 -i 

在彈出的編輯器,刪除,說相當於行:

pick B 

保存並退出

這樣做基本上會在「B_amended」之上重播「C」。

2

在你的情況下,你可以檢出branch_1和git cherry-pick branch_2,它將C提交到你的branch_1和git reset --soft branch_2的提示上,以將branch_2放到最新的提交中。

你也可以做一個變基(這可能是更直接),git rebase --onto branch_1 branch_2~1 branch_2

從混帳合併--help:

First let's assume your topic is based on branch next. For example, a feature developed in topic depends on 
    some functionality which is found in next. 

      o---o---o---o---o master 
       \ 
       o---o---o---o---o next 
            \ 
            o---o---o topic 


We want to make topic forked from branch master; for example, because the functionality on which topic 
    depends was merged into the more stable master branch. We want our tree to look like this: 

      o---o---o---o---o master 
       |   \ 
       |    o'--o'--o' topic 
       \ 
       o---o---o---o---o next 

    We can get this using the following command: 

     git rebase --onto master next topic 

    Another example of --onto option is to rebase part of a branch. If we have the following situation: 

            H---I---J topicB 
           /
         E---F---G topicA 
         /
      A---B---C---D master 

    then the command 

     git rebase --onto master topicA topicB 

    would result in: 

         H'--I'--J' topicB 
        /
         | E---F---G topicA 
         |/ 
      A---B---C---D master 

    This is useful when topicB does not depend on topicA. 
相關問題