Как работает трехстороннее слияние в Mercurial / Meld? - PullRequest
33 голосов
/ 02 октября 2010

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

o  changeset:   134:7f81764aa03a
|  tag:         tip
|  parent:      128:451d8a19edea
|  summary:     Backed out changeset 451d8a19edea
|
| @  changeset:   133:5eefa40e2a29
| |  summary:     (Change I need to keep keep)
| |
*snip 3 commits*
| o  changeset:   129:5f6182a97d40
|/   summary:     (Change I need to keep keep)
|
o  changeset:   128:451d8a19edea
|  summary:     (Change that introduced a major problem)
|
o  changeset:   127:4f26dc55455d
|  summary:     (summary doesn't matter for this question)

Если я правильно понимаю, r127 и r134 абсолютно одинаковы. Когда я hg up -C -r 133 и затем запускаю hg merge, Мелд выскакивает с тремя формами одного из моих файлов: локальным, базовым и другим. local, кажется, r133, но мне трудно обернуть голову вокруг того, что означают «base» и «other».

Ответы [ 2 ]

35 голосов
/ 02 октября 2010

Локальный - это r133

Другие - это r134

База - это r128 (общий предок обоих r133 иr 134)

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

11 голосов
/ 02 октября 2010

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

  • Что такое база?

Base - это неизмененная версия ревизии, которую вы в настоящее время извлекли и работали над ней. где, возможно, другие изменения были отменены (вы можете иметь изменения между вашим текущим локальным и базовым!). это как раз то место, где ближайшая ревизия, от которой ни один другой форк не отклонился впоследствии (тот же родитель) (в вашем случае r128)

  • Что такое голова?

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

  • Что такое местное?

Local - ваша модифицированная версия (в вашем случае r133)

  • Что такое другое?

Другой - это некий ветвь / ветвь, в которой родитель также имеет основание (в вашем случае r134)

  • Как работает трехстороннее слияние?

3 способа слияния работают (по крайней мере, в объединении) иерархически. обычно слева направо так:

local> base> other / head

local / base в основном тривиальна, потому что это то, что вы изменили

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

Может быть несколько других / головных ревизий, но слияние не является вашей задачей, и поэтому более чем трехстороннее сравнение не имеет смысла.

...