Почему ртутный тупой при слиянии? Как я могу сделать вытягивание / объединение изменений проще? - PullRequest
2 голосов
/ 24 февраля 2011

Я только начал использовать Mercurial, и я думаю, что я пытаюсь сделать что-то очень простое, что-то, что должно быть довольно типичным, но я озадачен, почему это так сложно, и почему это не работает так, как надо это должно (ИМО).

Я делюсь некоторым хранилищем с другом, он вносит некоторые изменения, проверяет несколько файлов и загружает их. Теперь в SVN я привык просто обновлять свою рабочую копию и получать его изменения, без проблем. Но с ртутью видимо надо слить. Чего я не понимаю, так это: не должен ли Mercurial быть достаточно умным, чтобы понять, что если мой друг внес последние изменения, а я не трогал файлы, он должен просто использовать его версию файла ?? Очевидно, он не может понять это, и вместо этого он пытается объединить файлы, которые полностью терпят неудачу (на самом деле я установил Beyond Compare, который автоматически открывается, поэтому я не могу полностью обвинить Mercurial в неудачном слиянии).

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

1 Ответ

9 голосов
/ 24 февраля 2011

Слияние требуется только в том случае, если вы зафиксировали также и в своем хранилище. Если вы делитесь хранилищем со своим другом, он фиксирует один или несколько раз, пока вы ничего не делаете, когда он сделал, все, что вам нужно сделать, это вытащить и обновить, без слияния.

Если вы сделали локальные коммиты, вот как разворачивается сценарий:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4

Он совершает:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4---5---6

Вы совершаете:

local:    1---2---3---4---X---Y
central:  1---2---3---4
friend:   1---2---3---4---5---6

Он толкает:

local:    1---2---3---4---X---Y
central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

Вы тянете:

local:    1---2---3---4---X---Y
                       \
                        +-5---6

central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

Вы объединяете:

local:    1---2---3---4---X---Y---7
                       \         /
                        +-5---6-+

central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

Затем вы нажимаете, и он тянет, и все хранилища идентичны.

Однако, если вы ничего не сделали, пока он работал над проектом, вот как разворачивается этот сценарий:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4

Он совершает:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4---5---6

Он толкает:

local:    1---2---3---4
central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

Вы тянете и обновляете:

local:    1---2---3---4---5---6
central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

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

Таким образом, когда вы приступили к фиксации локальных изменений, клиент Subversion скажет: «Извините, вам нужно обновить, прежде чем вы сможете зафиксировать», и вам пришлось выполнить это обновление.

Если в этот момент вы изменили файлы, которые также изменились в центральном хранилище, Subversion объединит ваши локальные изменения с изменениями на сервере и обновит вашу точку ревизии вплоть до подсказки. Если бы не было конфликтов, это было бы тихим слиянием, иначе вы бы получили конфликты слияния.

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

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

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

...