2015-07-21 2 views
4

Есть ли способ автоматически переупаковать большой количество слияний? Ответы на другой вопрос, Rebasing a Git merge commit, предлагают использовать --preserve-merges, но это также приведет к перестановке нечетких коммитов.Rebase/Replay Merge Commits Only

Такое поведение нежелательно при объединении ветвей функций в мастер или ветку интеграции, а затем обнаружение того, что кто-то еще только что нажал изменения. Кроме того, полезно иметь возможность переустанавливать ветвь разработки на новое коммандное коммит или удалять исправления из разработки, которые не будут использоваться.

Например, учитывая следующее положение:

* 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 или скрипт, который может выполнить то, что я хочу?

BTW, делая 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. Так как rebase не вызвало сколько-нибудь значительного количества конфликтов, слияние тоже не будет.

+0

Я уже упоминал об этой возможности: «Я могу вручную сбросить настройки в исходное состояние/мастер, а затем повторно объединить те ветви, которые я уже сделал (используя параметр --rerere-autoupdate, так что мне не нужно reresolve конфликты), но это может стать довольно сложным, когда есть 15 слияний вместо 1. " –

+0

Просьба нарисовать точный график фиксации, отражающий то, что вы хотите. То, что у вас сейчас есть в качестве вашего желаемого результата, граф фиксации, который вы нарисовали, - это именно то, что вы говорите, чего вы не хотите, и хотите не перерезать конфликты, которые вы уже разрешили в существующем слиянии, - это еще один способ сказать, что вы хотите to ** re ** использование ** re ** corded ** re ** sults. – jthill

+0

График точный. Я просто хочу решение, которое практично для большого количества слияний. Чтобы процитировать исходный вопрос, «это может стать довольно сложным, если в нем будет 15 слияний вместо 1». Я постараюсь сделать это яснее. –