2015-07-21 314 views
4

有沒有什麼辦法可以自動重定位合併提交的數量?另一個問題Rebasing a Git merge commit的答案建議使用--preserve-merges,但這也會使非合併提交變得更加複雜。Rebase/Replay僅合併提交

當將功能分支合併到主或集成分支中,然後發現別人剛推送更改時,不需要此行爲。此外,能夠將開發分支重新綁定到新的主提交上,或者從開發中刪除不打算使用的修補程序是很有用的。

例如,假設以下情況:

* 7909b1a (origin/master) Merge bug/456 
|\ 
| * f9d43b6 (origin/bug/456) 456 - Change color 
|/ 
| * 32666f3 (HEAD, master) Merge branch 'bug/123' 
| |\ 
|//
| * 0939652 (origin/bug/123, bug/123) 123 - Fix Spelling 
|/ 
o 96c9aa9 (tag: v1.1.1) 

如果我運行git rebase --preserve-merges origin/master時,將導致以下情況:

* (HEAD, master) Merge branch 'bug/123' 
|\ 
| * 8e6ccbe 123 - Fix Spelling 
|/ 
* 7909b1a (origin/master) Merge bug/456 
|\ 
| * f9d43b6 (origin/bug/456) 456 - Change color 
|/ 
| * 32666f3 (ORIG_HEAD) Merge branch 'bug/123' 
| |\ 
|//
| * 0939652 (origin/bug/123, bug/123) 123 - Fix Spelling 
|/ 
o 96c9aa9 (tag: v1.1.1) 

這是不可取的,因爲犯0939652正在重做,但它已經被推到公共倉庫,所以它不應該被重播。我想要的結果如下:

* 710c5d7 (HEAD, master) Merge branch 'bug/123' 
|\ 
| * 0939652 (origin/bug/123, bug/123) 123 - Fix Spelling 
* | 7909b1a (origin/master) Merge bug/456 
|\ \ 
| |/ 
|/| 
| * f9d43b6 (origin/bug/456) 456 - Change color 
|/ 
o 96c9aa9 (tag: v1.1.1) 

我可以手動reset --hard原產/主,然後重新合併,我已經做了(使用--rerere-autoupdate選項,樹枝,這樣我就不必reresolve衝突),但是如果有15個合併而不是1,可能會變得非常複雜。

是否有任何內置的Git解決方案或腳本可以實現我想要的功能?

順便說一句,做git rebase -ip master,然後不挑選非合併提交不起作用。我得到

error: Commit 00... is a merge but no -m option was given. 
fatal: cherry-pick failed 
Could not pick 00... 

回答

-1

是的,你可以通過用正確的父母重做未推送的合併來得到這個結果。

git checkout -B master origin/master 
git merge bug/123 

並以與32666合併相同的方式處理任何衝突。由於改組沒有產生任何顯着的衝突數量,合併也不會。

+0

我已經提到過這種可能性,「我可以手動重置 - 難以產生/主,然後重新合併那些我已經做過的分支(使用--rerere-autoupdate選項,這樣我就不必重新解決衝突),但是當有15個合併而不是1個時,這會變得相當複雜。「 –

+0

請繪製一張準確的提交圖表反映你想要的。你現在所期望的結果是你所畫的提交圖,就是你說你不想要的合併,並且不希望重新解決已經在現有合併中解決的衝突,這只是說你想要的另一種方式重新**使用**重新**有線**重新**結果。 – jthill

+0

該圖準確。我只想要一個適用於大量合併的解決方案。引用最初的問題,「當有15個合併而不是1個時,這可能會變得非常複雜」。我會盡量讓這個更清楚。 –