Лучшие практики в mercurial: ветвь против клона и частичные слияния?
... поэтому я привык к простым вещам с Mercurial (add
, commit
, diff
) и узнал о файле .hgignore(yay!) и получил возможность создавать и переключение между ветвями (branch
, update -C
).
У меня есть два важных вопроса:
-
Если я нахожусь в ветке "Branch1", и я хочу извлечь некоторые, но не все изменения из ветки "Branch2", как бы я это сделал? В частности, если все изменения находятся в одном подкаталоге. (Я думаю, я мог бы просто клонировать весь репозиторий, а затем использовать инструмент слияния каталогов, например Beyond Compare, чтобы выбрать и выбрать мои изменения. )
-
Переключение между ветвями с помощью update -C
кажется таким легким, мне интересно, почему я хотел бы использовать clone
. Я могу только подумать о нескольких причинах (см. Ниже) - есть ли другие причины, по которым я не хватает?
а. если мне нужно действовать сразу по двум версиям/ветвям (например, выполнить разницу показателей производительности)
б. для резервного копирования (clone
репозитория на сетевой диск в физически другом месте)
с. сделать выбор и выбрать слияние, как я уже упоминал выше.
Ответы
Ответ 1
Я использую клон для:
- Краткосрочные локальные ветки
- Клонирование для разных машин и серверов разработки
Бывшее использование довольно редко для меня - в основном, когда я пытаюсь идея, я, возможно, захочу полностью отказаться. Если я хочу объединиться, я хочу объединить ВСЕ изменения. Такое разветвление в основном предназначено для отслеживания веток разных разработчиков, чтобы они не мешали друг другу. Чтобы прояснить этот последний момент:
- Я продолжаю работать над моими изменениями и вытаскивать изменения моих коллег, и они тянут мой.
- Когда это будет удобно для меня, я объединю ВСЕ изменения из одной (или всех) этих ветвей в мою.
Для ветвей функций или более длинных ветвей я использую именованные ветки, которые более удобно распределяются между репозиториями без слияния. Он также "чувствует" себя лучше, когда вы хотите выборочно объединиться.
В основном я смотрю на это следующим образом:
- Именованные ветки предназначены для разработки различных ветвей или версий приложения.
- Клоны предназначены для управления различными вкладами в одну и ту же версию приложения.
Что я беру, хотя на самом деле это вопрос политики.
Ответ 2
Для вопроса 1 вам нужно быть немного понятнее о том, что вы подразумеваете под "изменениями". Какие из них вы имеете в виду:
- "Я хочу вытащить некоторые, но не все, изменения в другой ветке в эту".
- "Я хочу вытащить последнюю версию некоторых, но не всех, файлов в другой ветке в эту".
Если вы имеете в виду пункт 1, вы должны заглянуть в расширение Transplant, в частности идею о том, что cherrypicking несколько наборов изменений.
Если вы имеете в виду пункт 2, вы бы сделали следующее:
- Обновите ветку, в которую хотите внести изменения.
- Используйте
hg revert -r <branch you want to merge> --include <files to update>
, чтобы изменить содержимое этих файлов так, как они находятся на другой ветке.
- Используйте
hg commit
, чтобы зафиксировать эти изменения в ветке как новый набор изменений.
Что касается вопроса 2, я никогда не использую клоны репозитория для ветвления, поэтому я не знаю. Я использую названные ветки или анонимные ветки (иногда с закладками).
Ответ 3
У меня есть еще один вариант для вас: "Меркурийные очереди".
Идея состоит в том, чтобы иметь стек патчей (без коммитов, "настоящих" патчей) на вашем текущем рабочем каталоге. Затем вы можете добавлять или удалять прикладные исправления, добавлять их, удалять, добавлять еще один и т.д. Один патч или его подмножество заканчивается, чтобы стать новой "функцией", которую вы, вероятно, хотите делать с ветвями. После этого вы можете применить патч как обычно (так как это изменение). Филиалы, вероятно, более полезны, если вы работаете с кем-то еще...?