2011-04-21 119 views
2

我的團隊正在研究git中的共享主題分支,我將稱其爲「topic1」。我正在研究一個由topic1構成的分支上的一些代碼的重構,我將稱之爲「重構」。我一直在定期將topic1合併到重構中,以便能夠隨時更新變化,但是尚未將重構合併回topic1,因爲重構仍在進行中。將基於主題分支的分支的更改合併到git中的其他主題分支

還有一個主題分支,我將其稱爲「topic2」,它最近由主人創建。我想要做的只是合併我對「重構」所做的更改由topic2創建的新分支,我將其稱爲「topic2_refactor」。 (IE的變化只能通過重構訪問,但不TOPIC1的提交。)

我知道怎麼看這些只是這些變化:

git log origin/refactor --not origin/topic1 

所以我想要做的是這樣的 - 但是這個語法是不正確的:

git checkout topic2 
git checkout -b topic2_refactor 

然後將此:

git merge origin/refactor --not origin/topic1 

還是這個:

git cherry-pick origin/refactor --not origin/topic1 

(以上似乎導致合併不屬於neccessary,由於一些變化,這在發生主,後來合併到重構分支衝突。)

我希望有是一個乾淨的方法,可以避免在「重構」分支歷史中稍後解決的不必要的合併衝突。這可能使用git rebase,git filter-branch等嗎?

回答

2

您可以嘗試git rebase--onto選項。這是什麼允許是底墊操作抓住它需要從你的「重構」分支應用diff文件,關閉基於「TOPIC1」,但隨後將其應用到「標題2」

git co refactor 
git co -b topic2_refactor 
git rebase --onto topic2 topic1 # bases the diffs off of topic1, but applies them to topic2 

您的成功可能會有所不同。仍然可能發生有問題的衝突。這個缺點是你現在有兩個單獨的重構分支,它們有相同的變化,但是因爲這是一個rebase,他們有不同的歷史,如果你不小心就很容易發生分歧(你必須經常從一個櫻桃中挑選一個分支到另一個或類似的東西)。

然後當兩個TOPIC1和標題2(重構)之後需要再次合併爲大師,因爲他們將有那些相同的重構提交你可能會遇到麻煩。雖然git通常相當不錯。

因爲它似乎重構是獨立於這些話題的分支,我會考慮的重訂重構分支關老爺的,所以當重構完成後,您可以合併這些變化到這兩個主題。

+3

您的最後一段是一些最好的建議。始終從您打算合併到其中的所有東西的共同祖先開始分支。 – Cascabel 2011-04-21 20:31:05

+0

謝謝,我會在當地的一家分店嘗試。重構分支由topic1構成的原因在於,它是topic1中引入的代碼的實驗重構,在創建分支時還沒有合併到master中(topic1已經合併到master中,但它的意圖更多作爲一個長期發展的分支,所以它的歷史再次與主人分離。) – Eliot 2011-04-21 20:55:50

+0

'git rebase --onto topic2 origin/topic1'似乎沒有效果。 在我諮詢了我的git書之後,我嘗試了'git rebase --onto new_refactor origin/topic1 origin/refactor'這看起來會產生相同的合併衝突,當我嘗試在我的問題中使用cherry-pick命令初始合併更改時,我已經在歷史中進一步手動解決了衝突。 :( – Eliot 2011-04-21 21:05:03

相關問題