TortoiseHG: не может частично совершить слияние

Я попытался объединить две головы в Mercurial. После слияния я не совершал и не делал никаких дополнительных изменений. Затем я попытался зафиксировать и получил следующее сообщение:

abort: не может частично выполнить слияние (не указывать файлы или шаблоны)

Я использую TortoiseHG как визуальную оболочку и Beyond Compare для сравнения и слияния. И я относительно новичок в них.

Что делать, чтобы успешно завершить фиксацию?

Ответ 1

Что делать, чтобы закончить фиксацию успешно?

Одним из преимуществ Mercurial (или git или любого другого DVCS) является то, что вы можете выполнить фиксацию в любой точке ваш процесс разработки, и он будет быстрым и конфиденциальным. Это будет быстро, потому что вы должны совершать локальную копию репозитория, находящегося на вашем жестком диске, и он будет закрыт, потому что никто не увидит ваш набор изменений, пока вы не нажмете их на сервер (или другой главный репозиторий).

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

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

Ответ 2

Mercurial/TortoiseHg правильно говорит вам, что вы не должны частично совершать слияние. Частичное означает, что вы не выполняете сразу все файлы.

Основной причиной этого сообщения является то, что дает неверные результаты. Когда вы объединяете два набора изменений в Mercurial, вы создаете новый набор изменений с двумя родительскими наборами изменений. Этот набор изменений слияния показывает другим, как вы хотите, чтобы все остальные объединили два набора изменений.

Представим себе, что вы начинаете с changeets A и B и хотите слить их. Это создает такой график:

... --- [A]
           \
            [M]
           /
... --- [B]

Представьте, что мы добавили строку A! в a.txt в набор изменений A и добавили B! в b.txt в набор изменений B. Только две независимые изменения, которые не конфликтуют. Если Mercurial разрешил вам совершать частичную фиксацию, вы можете сделать это:

hg merge
hg commit -m 'Added A!' a.txt  # creates M
hg commit -m 'Added B!' b.txt  # creates M'

и результатом будет этот график:

... --- [A]
           \
            [M] --- [M']
           /
... --- [B]

Если вы посмотрите на b.txt вдоль пути B, M, M', вы увидите, что строка с B! была введена в B, удалена в M и повторно введены в M'!

Это не то, что вы хотите от набора изменений слияния: частичное слияние отбрасывает изменения из одной ветки только для того, чтобы представить их снова в последующей фиксации. Mercurial доверяет вам при создании M: он действительно считает, что M содержит правильное сочетание A и B. В частности, если строка B! удалена в M, тогда она останется в стороне, когда вы объедините M с другими наборами изменений.

Итак, Mercurial пытается защитить вас от создания плохой истории, не допуская частичных слияний.

Ответ 3

Я думаю, что у вас есть псевдонимы в файле hgrc. Попробуйте удалить раздел [alias] и снова зафиксировать.

Ответ 4

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

Ответ 5

У меня была такая же проблема, и я НЕ указывал файлы и использовал командную строку.

Проблема заключалась в разделе [default] в моем .hgrc

[defaults]
commit = -X project/web.config

Таким образом, по умолчанию для каждой операции фиксации добавлены определенные файлы.

Просмотрите раздел по умолчанию для потенциальных проблем.