2014-02-25 256 views
1

我剛剛完成在其自己的分支(分支feature)上開發一個新功能,由十幾個提交組成。運行完所有測試後,我將此分支合併到master,並解決了許多合併衝突。這個過程花了很長時間。只有我完成了合併我是否意識到我從來沒有重新設置feature分支中的任何提交,這通常是我的做法。rebase衝突,在git中合併提交

總之,現在我有:

(feature) B-C-D 
(master) A-/  \-E (merge commit in master) 

但我想有:

F 
A-/ \-D 

其中F = B + C + d 「壓扁」 在一起。

我要對這個辦法是從master創建另一個分支master_prime開始在提交A。然後,切換到feature分支並完成我想要的所有提交壓縮。最後,合併featuremaster_prime。唯一的問題是我必須再次解決所有合併衝突。有沒有一種方法可以重播/挑選合併提交E,這樣就沒有必要?

我也試圖git rebase --preserve-merges -i <A>以及git rebase -i <A>,它們不允許我重新綁定我想要的提交或讓我再次處理合並衝突。

回答

0

我覺得有可能通過多種方式來完成你想要什麼,但有幾樣事情第一:

1)你並不需要一個新的主分支,如果你不想。您可以使用git reset將當前主分支的點更改回A,或者不需要新命名的分支。 (你也可以創建新master_prime,你要得到它爲「世界上最好的地方」,並重新命名mastermaster_old和重命名master_primemaster什麼。

但是,這一切除了點,因爲它不是真的你在問什麼。

你想要的是特性分支featureAD在它所有需要的變化。而且...使合併所需要的變化。在這一點上,你可能要變基,因爲這仍然是一個痛苦,但你可以做你的擠壓,並將你的合併編輯複製到位(使用reset而不是一個新的分支作爲exerci SE讀者):

​​

認爲

1

使用git read-tree重用你合併衝突的解決。

我假設你將feature合併爲master。如果將master合併到feature中,請使用master^2而不是master^(反之亦然)。

  1. 對您的合併提交進行備份。

    git branch merge-backup master 
    
  2. 壓扁feature中的提交。確保你不會意外改變任何事情。

    git checkout feature 
    # ... squash the commits ... 
    git diff master^2 
    
  3. 擺脫舊合併提交的。

    git checkout master 
    git reset --hard master^ 
    
  4. 合併的擠壓feature支進master,重用舊的衝突解決。

    git merge feature 
    git read-tree --reset -u merge-backup 
    git commit 
    
  5. 如果你是高興的結果,刪除備份分支。

    git branch -D merge-backup