Амалгамирайте две сливания в Git

Имам Git клон, който е topic клон, който показва проекта master. Обединих го с главния и разреших конфликт ръчно. След това критична грешка беше коригирана в master и аз се слях отново, този път без конфликт. Самият аз не съм ангажирал нищо между двете сливания и не съм прехвърлил клона на никой друг. Бих искал да комбинирам двете сливания.

Това, което имам сега е:

master ----A---B-----C---------->
                \     \
topic   ---W-----X-----Y-------->

Където:

  • X е сливането, при което е коригиран конфликт
  • C е критичната корекция на грешка в master
  • Y е сливането, включващо тази корекция

Бих искал да превърна това в:

master  ----A---B---C----------->
                     \
topic   ----W---------X'-------->

Където X' сега е сливане, включващо разрешаването на конфликти и корекцията на грешки в един комит за сливане.

Знам, че мога да го направя ръчно, като извадя W и слея master и копирам съдържанието на разрешените файлове от X по време на неизбежния конфликт. Има ли по-бърз начин с по-малък шанс да го объркате (в случай, че конфликтът е голям и грозен)?


person Inductiveload    schedule 02.06.2014    source източник


Отговори (3)


Ако наистина не сте натискали нищо поне от W, тогава това вероятно е най-лесният начин (извън действителното разрешаване на конфликти - което може да е болезнено, предполагам) да го постигнете:

git checkout topic
git reset --hard W
git merge master

Ако обаче сте натискали от W (по-специално ако X или Y съществуват някъде извън вашето хранилище), не съм сигурен, че има чисто решение за това - без значение какво правите, ще създадете проблеми за всеки друг хранилища, които имат X или Y в тях.

Разбира се, ще трябва да направите отново разрешаването на конфликта, освен ако не сте активирали rerere.

person twalberg    schedule 02.06.2014
comment
С rerere това е точно това, което исках. - person Inductiveload; 02.06.2014

По-бързо?

git checkout topic
git rebase -i W

След това можете да смачкате последните два ангажимента.

git merge -ours master

(за да запишете отново сливането между master и topic, без да се налага да "повтаряте" сливането)

Можете също да опитате с опцията -p (--preserve-merge), за да запазите тези връзки за сливане между master и тема

git rebase -p -i W
person VonC    schedule 02.06.2014

Със сигурност можете да направите git rebase origin/master тук..

Друг момент е, че клоновете са евтини. Защо не създадете отделен клонинг на вашия topic да речем topic' и след това да го манипулирате, накрая можете да направите разлика между него и topic, за да си покажете, че не сте променили нищо (промени се само историята на ангажиментите)

person UpAndAdam    schedule 02.06.2014
comment
Да, това е един от начините да го направите, но след това трябва ръчно да повторите всички разрешавания на конфликти. - person Inductiveload; 02.06.2014