Распространение изменений в Mercurial - PullRequest
3 голосов
/ 23 ноября 2011

У меня следующий вопрос.Предположим, у меня есть несколько хранилищ, которые образуют иерархию, например: A -> B -> C (означает, что A - это центральное хранилище, а все остальные - его потомки).

Теперь предположим, что я работаю склон C. Предположим, я хочу получить изменения не только из C, но и из центрального репозитория, поэтому я делаю следующие команды:

hg pull [Address of A]
hg up

Это кажется совершенно законным, но что происходит, тогда я фиксирую своиизменения и подтолкнуть их к С?Будут выдвинуты не только мои локальные модификации, но и модификации центрального репозитория (если они есть).Что произойдет, если кто-то попытается перенести изменения с А на С?Будет ли конфликт или он успешно объединит изменения A -> local -> C с изменениями A -> C. Признает ли Mercurial тот же набор изменений или нет?

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

hg commit -u spirit -m "A local modification that is stable"
hg push [Address of A]

Что произойдет, если я сделаю переход от А к С изатем снова перетащите из C в мое локальное репо, распознает ли он эти изменения как происходящие из моего локального репо, или сообщит о конфликте и предложит слияние?

И что в любом случае является наилучшей практикой в ​​этом случае?Выполняет только последующие подтягивания и нажатия (то есть A <-> B, B <-> C, C <-> local)?Но проблема в том, что у меня есть только доступ к моему локальному репозиторию, который является клоном C. Как я могу сделать тягу из B в C, если я захочу на моей локальной машине?Как работает Mercurial

Ответы [ 2 ]

5 голосов
/ 23 ноября 2011

Что произойдет, если кто-то попытается перенести изменения с А на С?Будет ли конфликт или он успешно объединит изменения A -> local -> C с изменениями A -> C. Признает ли Mercurial тот же набор изменений или нет?

Наборы изменений, которые ужесуществует в C, будет видно, что уже существует, потому что их идентификаторы уже будут присутствовать.Вот почему изменения неизменны.Если бы вы могли изменить набор изменений, его идентификатор изменился бы (идентификатор представляет собой хэш содержимого набора изменений).Тогда Mercurial (правильно) видит это как другой набор изменений.Сохраняя неизменность наборов изменений, мы можем быть уверены, что их хэш будет одинаковым для любого репо.

  • pull = копировать туда наборы изменений с идентификаторами, которых я не видел
  • push = скопировать туда изменения с идентификаторами, которые они не видели

Будет ли конфликт

Нет

или он успешно объединит изменения A -> локальные -> C с изменениями A -> C.

Объединение не происходит, поскольку они являются одинаковыми изменениями.Он просто видит, что он уже есть.

Слияния не произойдет, если вы не захотите объединить изменения из двух параллельных наборов изменений, и только если вы явно не попросите об этом.

1 голос
/ 23 ноября 2011

Пока набор изменений идентичен, то есть они имеют одинаковый хэш идентификатора. Mercurial считает их одинаковыми.

Когда вы изменяете наборы изменений с помощью команд rebase или mq, хэши id меняются, и mercurial может поместить два очень похожих набора изменений в репозиторий.

...