Лучшие практики в 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

У меня есть еще один вариант для вас: "Меркурийные очереди".

Идея состоит в том, чтобы иметь стек патчей (без коммитов, "настоящих" патчей) на вашем текущем рабочем каталоге. Затем вы можете добавлять или удалять прикладные исправления, добавлять их, удалять, добавлять еще один и т.д. Один патч или его подмножество заканчивается, чтобы стать новой "функцией", которую вы, вероятно, хотите делать с ветвями. После этого вы можете применить патч как обычно (так как это изменение). Филиалы, вероятно, более полезны, если вы работаете с кем-то еще...?