Mercurial Слияние только определенных наборов изменений
Хорошо, поэтому мы недавно превратились из SVN в Mercurial.
Обычно мы используем TortoiseHG.
В нашем одном репозитории мы имеем все наши проекты, С++/.NET/ASP. У нас около 100 проектов, все из которых используются в общих библиотечных проектах.
Поэтому было бы довольно сложной задачей создать несколько репо для каждого проекта.
Теперь у нас есть ветвь default
, и пусть скажем branchA
.
Я работаю над branchA
и добавляю к нему свои uber-изменения, и я меняю общую библиотеку, скажем, метод расширения
Я хочу зафиксировать это с помощью branchA
и default
, как бы я это сделал?
Однако я не хочу, чтобы все мои изменения из branchA
были объединены в default
, и я не хочу, чтобы все остальные изменения от default
Надеюсь, это достаточная информация!
Ответы
Ответ 1
Есть способ избежать этой проблемы. Вы можете внести все свои изменения в отдельные ветки функций из некоторой базовой версии, как правило, тег последней версии или какой-либо другой стабильной точки S
.
Таким образом, ваше изменение X
будет на его собственной ветке, которая может быть объединена с другими ветвями (слияния M1
и M2
) без введения нежелательных наборов изменений:
-----S--o----o---M1----o---> default
| /
|---------X feature or bugfix
| \
\--o---o----M2----o-----> BranchA
Это требует только обычных операций hg merge
; нет необходимости в патчах, Transplant или MQ.
Ответ 2
Просто, чтобы немного улучшить содержимое: есть команда трансплантат, которая реализует выбор вишни в Mercurial.
Эта команда использует Mercurial merge logic для копирования отдельных изменений из других ветвей без объединения ветвей в графе истории. Это иногда называют "backporting" или "cherry-picking". От по умолчанию, графт скопирует пользователя, дату и описание из источника Изменения.
Ответ 3
Если вы разделяете общий код в своем собственном репозитории, вы можете использовать subrepos для включения его в каждый проект.
Кстати, я бы рекомендовал иметь отдельный репозиторий для каждого проекта, особенно если их так много.
Ответ 4
То, что нужно, это не слияние, а вишня. Вы можете использовать https://www.mercurial-scm.org/wiki/TransplantExtension, но помните об упомянутых там осложнениях.
Ответ 5
Вы описываете "выбор вишни" или "частичное слияние", что в настоящее время невозможно с Mercurial. У вас есть несколько вариантов:
- Отделите свой общий код в своем собственном репозитории.
- Создайте разницу ваших изменений, которые вы внесли в свой общий код, и примените их к ветке
default
.