Есть ли способ автоматически переупаковать большой количество слияний? Ответы на другой вопрос, 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...
Я уже упоминал об этой возможности: «Я могу вручную сбросить настройки в исходное состояние/мастер, а затем повторно объединить те ветви, которые я уже сделал (используя параметр --rerere-autoupdate, так что мне не нужно reresolve конфликты), но это может стать довольно сложным, когда есть 15 слияний вместо 1. " –
Просьба нарисовать точный график фиксации, отражающий то, что вы хотите. То, что у вас сейчас есть в качестве вашего желаемого результата, граф фиксации, который вы нарисовали, - это именно то, что вы говорите, чего вы не хотите, и хотите не перерезать конфликты, которые вы уже разрешили в существующем слиянии, - это еще один способ сказать, что вы хотите to ** re ** использование ** re ** corded ** re ** sults. – jthill
График точный. Я просто хочу решение, которое практично для большого количества слияний. Чтобы процитировать исходный вопрос, «это может стать довольно сложным, если в нем будет 15 слияний вместо 1». Я постараюсь сделать это яснее. –