2014-09-02 4 views
6

Как разработчик на PHP-Src Недавно я нашел себя в следующей ситуации:перебазироваться на предыдущих изменения с нетривиальным слиянием совершает настоящий локально

A B C 
o---o---o   version1 
     \ 
o---o-----o---o master 
x y  D E 

o---o---o   upstream/master 
x y z 

Так что, когда я git push --dry-run upstream master version1 я получаю типичный:

! [rejected]  master -> master (fetch first) 

Мой естественный ответ перебазироваться пораженную ветвь и сохранить слияние совершает:

git fetch upstream 
git rebase -p upstream/master 

Важно отметить, что первоначальная фиксация слияния не была тривиальной, потому что существует так много изменений между ветвью версии и мастером; он предпринимает усилия для разрешения такого слияния.

Выполнение вышеуказанной операции перезаписи вызывает конфликт слияния, и я должен снова разрешить его; это почти то же самое, что я уже сделал.

Есть ли лучший способ сделать это? Или я забыл очевидный вариант переустановки?

+0

У вас есть * для восстановления? Я обычно переустанавливаю, но я тоже был в вашей ситуации, когда это было просто невозможно, и затем пошел со стандартным слиянием. – musiKk

+0

Конечно, я могу просто нажать 'D, E, M (z)' вместо 'D ', E'', но я предпочитаю сохранить историю как можно чистую, как я могу :) –

+1

Я вас слышу. Это зависит от вашего дела. Я работал над слияниями, которые занимали часы. Моя любовь к чистой истории идет только до сих пор. :) – musiKk

ответ

3

В идеале вы должны «повторно записанное разрешение» с rerere:

В рабочем процессе с использованием сравнительно долгоживущая темой ветвей, разработчику иногда нужно снова и снова, пока тема ветвь не решить одни и те же конфликты либо объединены в ветку «выпуска», либо отправлены и приняты вверх по течению).

Эта команда помогает разработчику в этом процессе записывать конфликтующие результаты автосекретаря и соответствующие результаты разрешения руки при первоначальном слиянии вручную и применять ранее записанные разрешения рук к их соответствующим результатам автосекретаря.

К сожалению, эта функция должна быть включена, прежде чем сначала сделать слияние:

Примечание: Вам нужно установить переменную конфигурации rerere.enabled для того, чтобы включить эту команду.

Насколько я знаю, нет ярлыка, чтобы сделать что-то подобное после факта. Я рекомендую позволяет rerere глобально и затем переделка слияния:

git config --global rerere.enabled true 

В будущем эта установка может сэкономить много времени!

+0

Я * думаю * это может быть именно то, что мне нужно, приятно найти! :) –

+2

Ярлык для ретроактивного включения rerere здесь должен быть просто 'git config rerere.enabled true; git checkout y; git merge -s ours --no-commit C; git read-tree -um HEAD D; git commit; git checkout master'. – jthill

+0

@ Это не выглядит просто для меня, но если это сработает, это было бы приятным дополнением к этому ответу или отдельному :) –

Смежные вопросы