Объединение веток Mercurial из отдельных репозиториев
Я пытаюсь выяснить, как объединить ветки из отдельного репо в текущий.
У меня есть следующее:
PJT1
- содержит ветки default и foodog
PJT2
- содержит значение по умолчанию
из PJT2, я делаю следующее:
$ hg fetch -y ../PJT1 -r foodog -m "this is a test"
Теперь, если я смотрю в PJT2, я вижу правильные файлы и изменения. Однако, если я делаю hg branches
, я получаю следующее:
[[email protected] pjt2]$ hg branches
foodog 1:c1e14fde816b
default 0:7b1adb938f71 (inactive)
и hg branch
показывает следующее:
[[email protected] pjt2]$ hg branch
foodog
Как получить содержимое из ветки PJT1 foodog
в ветку PJT2 default
?
Ответы
Ответ 1
Вам нужно объединиться, но имейте в виду, что изменения на ветке foodog всегда будут на foodog - ветки никогда не уходят, но они могут быть скрыты. Эта последовательность команд находится как можно ближе к тому, что вы просите:
cd PJT2
hg update default # just in case you were somewhere else
hg pull ../PJT1 -r foodog # that gets you foodog
hg merge foodog # that merges the changes into default
hg commit # commit the merge
hg update foodog # go to the most recent change in foodog (note: it is not a 'head')
hg commit --close-branch
После слияния hg branches
будет отображаться foodog
, если вы не сделаете hg branches --active
, который показывает только ветки с головками. После commit --close-branch
вы не увидите foodog
, если вы не сделаете hg branches --closed
.
Это потому, что ветки в Mercurial никогда не уходят полностью (конструктивная особенность), что они часто зарезервированы только для жизненных вещей, таких как release-1.0
или stable
. Для недолговечных усилий, таких как ошибки и функции, используйте вместо них закладки. Здесь большое сравнение двух: http://stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
Ответ 2
Вы также можете попробовать использовать расширение rebase. Он будет выглядеть примерно так:
hg fetch -y ../PJT1 -r foodog -m "this is a test"
hg rebase --source <sRev> --dest <dRev>
Действие по перестановке будет отменять набор изменений sRev и всех потомков и применить группу изменений к набору изменений dRev. По умолчанию изменения будут применены к ветке по умолчанию. Итак, в вашем случае sRev будет первым набором изменений в ветке foodog, а dRev будет набором изменений по умолчанию, к которому вы хотите применить.
Наконец, если вы хотите переопределить это и сохранить имя ветки источника, вы можете использовать опцию rebase --keepbranches
. Ваши вопросы указывают, что это именно то, чего вы не хотите делать, но все равно следует отметить.