2013-07-10 76 views
1

在git中的多個分支之間劃分一組更改的方式是什麼「最好的」(閱讀:「最簡單」,「首選」,「正確」)?例如,假設我在處理分支X時做了一組(未提交的)更改,但其中一些更改實際上需要提交到分支Y,另一些更改爲分支Z,還有一些更改爲分支W;通常我會本能地做的(比如推薦的here)是存儲更改,檢出Y,應用更改,僅提交與Y相關的內容,然後重複其他分支。我遇到的問題是,應用隱藏的更改通常會導致必須處理的合併衝突,並且如果我執行隱藏彈出而不是應用(這經常發生,足以對我造成真正的風險!),我結束了針對Y分支中的Z的混合變化,並且他們必須手動解開。git中的多個分支之間如何劃分變化?

有沒有更好的方法?我能更好地處理這種情況嗎?

請注意,我的問題與如this one這樣的問題有關,但不同之處在於我尋求在多個分支間劃分當前一組更改的最佳方法。還要注意,在開發這組變更之前,我不能切換到Y,Z或W;我必須從X開始並在X上開發一組更改。

+0

*「另外請注意,我不能切換到Y,Z,或開發組更改W的前,我不得不開始對X和發展集X上的變化「*:這聽起來像這些變化都是相關的。如果是這樣,當他們依賴對另一個分支的更改時,你如何將它們提交給不同的分支? –

+0

@DanielHilgarth,這些變化是相關的,但我想在不同分支中提交它們的原因是,使用分支Y,Z和W的其他人也可以使用這些改進;一些變化邏輯上屬於分支Y,Z和W,希望這些改進的人可以將它們合併到這些分支中。 – BlueBomber

+0

那麼,爲什麼你不能直接在各自的分支上發展這些變化呢?只是試圖瞭解你的情況在這裏... –

回答

1

git存儲和多個分支的問題是,一旦它彈出,您必須再次存儲下一個分支。爲了解決這個問題,只需使用臨時分支很容易。

git checkout -b temp_branch 
git commit -a -m 'Changes that will go to several branches.' 
git checkout W 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for W.' 
git checkout X 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for X.' 
git checkout Y 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for Y.' 
git checkout Z 
git cherry-pick -n temp_branch 
(fixup all files here here) 
git commit -a -m 'Changes for Z.' 
git branch -D temp_branch 
+0

這讓我覺得等同於存儲,然後在每個分支上應用(但不彈出)存儲並有選擇地提交更改。我錯過了什麼嗎? – BlueBomber

+0

這些步驟不會幫助您解決合併衝突。這是我認爲不可避免的,因爲你不希望git在這種情況下試圖爲你做點什麼。 – cforbish

1

避免合併問題的一種方法是在原始分支中進行多次提交,然後從目標分支中選擇它們並最終回滾更改。

像這樣:

git add -i 
git commit -m 'changes for X' 
git add -i 
git commit -m 'changes for Y' 
git log -n 2 # to see hashes 
git checkout X 
git cherry-pick <hash of the first commit> 
git checkout Y 
git cherry-pick <hash of the second commit> 
git checkout original_branch 
git reset --hard HEAD~2