2012-11-08 19 views
3

什麼是最好的方式來「分岔」一個項目,與維護人員的變化保持聯繫,並開發自己的功能,同時仍然能夠輕鬆地回饋任何功能,如果他們曾經被接受?如何獲得修改後的主站和遠程主站上的分支之間的差異?

這是我做的,但遇到了問題。

我已經克隆了一個存儲庫,在Feature1分支中做了一些工作,然後合併了從原點然後從feature1,然後原點的更改... 然後我開發了feature2,當然,它也包含feature1代碼。 下面的藝術描述了場景(希望)。

我有我的主人在上游的所有變化,並在他們之上發展。但是,我無法回饋Feature2,因爲它還包含Feature1代碼。我能做什麼?如何獲得針對'aaa'的feature2補丁?

Rebase Feature2和櫻桃挑選排除Feature1提交?沒有太多的解決方案。

git format-patch f2..f4然後git am?所有的補丁必須手動應用!

  Feature1         Feature2 
      a---b---c---d---e---f---g-----h---i   f2---f3---f4 
     /    \    \ \  /
    --------x'---y'---z'----1---o'---p'---2---3---q'-----r'---t'---l'---aaa' 
    / /// //   / ///
origin----x----y----z--------o----p-------------q------r----t----l---aaa 
+0

使用Github *咳嗽* – mauris

回答

1

如果您想保留圖中所示的合併工作流程。

git rebase --onto q Feature2 
git checkout aaa 
git merge Feature2 

如果我理解正確的圖表,這將改變你的本地庫弄成這個樣子:

 Feature1 
     a---b---c---d---e---f---g------h---i 
    /    \    \ \ 
     ------x'---y'---z'--1----o'---p'---2---3----aaa' 
    / /// //
origin----x----y----z--------o----p-------------q----r----t----l---aaa 
               \ \ \ \ 
                \----r'---t'---l'---4---aaa'' 
                \    /
                f2---f3---f4----- 
                Feature2 

如果特徵2不依賴於任何的特徵1所做的更改,這是所有你需要這樣做。如果Feature2確實取決於Feature1的某些更改,則必須將這些更改挑選到Feature2分支上。

替代溶液

另一種方法是忘掉所有的合併,並直接變基特徵2到適當的上游提交(AAA)。如果需要,您可以對Feature1執行相同的操作。

git rebase --onto aaa Feature1 
git rebase --onto aaa Feature2 

這會使你的本地庫看起來像這樣:

       a---b---(...)---aaa' Feature1 
          /
origin---x---(...)---t---l---aaa 
           \ 
           f2---f3---f4---aaa'' Feature2 

同樣,這僅僅在進行特點2邏輯上並不依賴於特徵1。如果是這樣,您仍然必須從Feature1中挑選那些東西到Feature2上。

+0

您的解決方案不起作用,因爲f2-f4包含來自Feature1的代碼。變更通常在同一個函數中,甚至在同一行中(例如變量聲明或條件),所以即使是每次提交都必須手動完成櫻桃採摘。看來我需要一種方法來做類似減法的操作f2..f4 - a..i來獲得乾淨的補丁?! – user1768401

+0

據我所知,在這種情況下,無論您如何操作,都必須從Feature1中手動梳理Feature2的邏輯。 – Bryan

相關問題