лучшие практики в Mercurial: ветвление против клона и частичные слияния? - PullRequest
74 голосов
/ 16 января 2009

... так что я привык к простым вещам с Mercurial (add, commit, diff) и узнал о файле .hgignore (yay!) И получил навык создания и переключение между ветвями (branch, update -C).

У меня есть два главных вопроса:

  1. Если я нахожусь в ветви "Branch1" и я хочу получить некоторые, но не все изменения из ветви "Branch2", как мне это сделать? Особенно если все изменения находятся в одном подкаталоге. (Полагаю, я мог бы просто клонировать весь репозиторий, а затем использовать инструмент слияния каталогов, такой как Beyond Compare, чтобы выбрать и отредактировать мои изменения. Похоже, должен быть способ просто изолировать изменения в одном файле или одном каталоге.) 1012 *

  2. Переключение между ветвями с помощью update -C кажется таким простым, мне интересно, почему я бы не стал использовать clone. Я могу думать только о нескольких причинах (см. Ниже) - есть ли другие причины, по которым я скучаю?

    а. если мне нужно работать с двумя версиями / ветвями одновременно (например, выполнить разность показателей производительности)

    б. для резервного копирования (clone хранилище на сетевом диске в физически другом месте)

    с. сделать слияние, как я уже упоминал выше.

Ответы [ 3 ]

50 голосов
/ 16 января 2009

Я использую клон для:

  • недолговечные местные отделения
  • Клонирование на разные машины и серверы разработки

Первое использование довольно редко для меня - в основном, когда я пытаюсь понять идею, которую я, возможно, захочу полностью отказаться. Если я хочу объединить, я хочу объединить ВСЕ изменения. Этот вид ветвления в основном предназначен для отслеживания веток разных разработчиков, чтобы они не мешали друг другу. Просто чтобы прояснить этот последний момент:

  • Я продолжаю работать над своими изменениями и вытягиваю изменения своих коллег-разработчиков, а они тянут мои.
  • Когда мне будет удобно, я объединю ВСЕ изменения из одной (или всех) этих веток в мою.

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

В основном я смотрю на это так:

  • Именованные ветки предназначены для разработки разных веток или версий приложения
  • Клоны предназначены для управления различными вкладами в одну и ту же версию приложения.

Это мое мнение, хотя на самом деле это вопрос политики.

29 голосов
/ 26 июля 2009

В вопросе 1 вам нужно немного лучше понять, что вы подразумеваете под «изменениями». Что из этого вы имеете в виду:

  1. «Я хочу перенести некоторые, но не все, наборы изменений из другой ветви в эту».
  2. «Я хочу вытащить в эту ветку последнюю версию некоторых, но не всех файлов из другой ветки».

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

Если вы имеете в виду пункт 2, вы бы сделали следующее:

  • Обновление ветки, в которую вы хотите перенести изменения.
  • Используйте hg revert -r <branch you want to merge> --include <files to update>, чтобы изменить содержимое этих файлов так, как они находятся в другой ветви.
  • Используйте hg commit, чтобы зафиксировать эти изменения в ветке как новый набор изменений.

Что касается вопроса 2, я никогда не использую клоны репозитория для ветвления себя, поэтому я не знаю. Я использую именованные ветви или анонимные ветви (иногда с закладками).

3 голосов
/ 16 января 2009

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

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

...