Объединение некоторых версий, но не других, с Mercurial - PullRequest
3 голосов
/ 21 апреля 2011

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

Каков наилучший способ обновления до ревизии до того, как я начал реализовывать эту функцию, но выборочно включать изменения вдоль ветви по умолчанию в новую отдельную ветку? Это правильный способ слияния / ветвления с Mercurial? Если я сделаю это, могу ли я позже "отбросить" одну из этих веток в пользу одной конкретной реализации этой функции?

Ответы [ 2 ]

3 голосов
/ 21 апреля 2011

Это очень легко, если у вас есть внешняя программа сравнения, такая как Beyond Compare.

  1. Включите расширение extdiff и настройте его для использования вашей программы различий (например, моя система настроена так, что hg bcompare будет запускать Beyond Compare)
  2. Обновите рабочий каталог вашего репо до версии, в которой вы хотите начать новую ветку.
  3. Используйте Mercurial для запуска вашей программы сравнения с головой с экспериментальными изменениями.
  4. Cherry выбирает нужные вам изменения из экспериментального кода, либо целые файлы, либо меньшие различия в файлах.
  5. Когда вы выходите из программы diff, в вашем рабочем каталоге будут изменения, которые вы выбрали.
  6. Начать новую ветку (hg branch) или установить закладку (hg bookmark) для отслеживания этого нового набора изменений. См. http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial/ для описания различий.
  7. Зафиксируйте изменения и вперед!

Когда вы решите, какую реализацию вы хотите, вы можете либо обновить заголовок ветки, которую вы не хотите, и использовать hg commit --close-branch, чтобы пометить его как закрытое, что все еще оставляет его как голову в хранилище. Если вы хотите удалить его как заголовок, обновите заголовок ветки, которую вы делаете хотите, и используйте hg merge --tool internal:local <rev-of-the-other-head>, чтобы объединить ее, но сохраните все требуемые изменения.

1 голос
/ 10 февраля 2012

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

  1. Я обновил до последней хорошей ревизии (в моем случае, R0!) Через hg update -R 0
  2. Я создал новую ветку для функции ( hg ветка NEWFEATURE и hg commit )
  3. Я начал хорошо собирать вишню фиксирует из другой ветви через трансплантат ( рт.ст. -b значение по умолчанию revNumberToPick )

Сейчас Transplant поставляется в коробке с Mercurial, и вам нужно только включить его. Документация находится на Mercurial wiki . Надеюсь, это поможет!

...