Объединение двух слияний в Git

У меня есть ветка Git, которая является веткой topic и показывает проект master. Я объединил его с мастером и разрешил конфликт вручную. После этого в master был исправлен критический баг и я снова слился, на этот раз без конфликтов. Я ничего не делал сам между двумя слияниями и никому не передал ветку. Я хотел бы объединить два слияния.

Что у меня есть сейчас:

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

Где:

  • X — слияние, в котором был исправлен конфликт
  • C - исправление критической ошибки на мастере
  • 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), чтобы сохранить эти ссылки слияния между мастером и темой.

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