2015-04-09 3 views
21

Я знаю, что Rebase является (в комплекте) расширением, а Graft - это основная функция (которая заменила расширение Transplant (в комплекте)).В Mercurial какая разница между hg-трансплантатом и hg rebase

graft документирована как:

копирования изменений из других веток на текущей ветви

Эта команда использует слияние логики Mercurial, чтобы копировать отдельные изменения от других ветвей без слияния ветвей в истории графа , Это иногда называют «backporting» или «cherry-picking».

rebase документирована как:

Rebase позволяет перемещение совершает вокруг в истории Mercurial (используя ряд внутренних слияний). Это имеет множество применений:

  • двигающихся ревизии между ветвями
  • «линеаризацией» Историей
  • переупорядочением ревизий
  • коллапсом несколько изменений в одну ревизии

И, кажется, использовать слияние с перемещать или копировать изменения между ветвями.

Почтовые копии. Перемещение перемещается. Но rebase --keep экземпляров.

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

E.g. следует ли прививку использовать только при копировании на другой с именем? Или только когда есть только один набор изменений?


Edit: Может быть, что перебазироваться является потенциально небезопасным надмножеством трансплантата, но могут быть использованы только с draft ревизиями в процессе разработки для редактирования местной истории, в то время как трансплантат безопасное подмножество перебазироваться, которые могут быть использованы с public Изменения во время обслуживания для резервного копирования?

+2

Обратите внимание, что мой основной вопрос не обязательно должен содержать список всех незначительных технических различий, но найти правило/логическое обоснование между ними **, когда либо кажется, что работает **. Или я должен использовать только то, что кажется более удобным? – Peter

ответ

26

hg graft позволяет «вишневый сбор», как вы отметили в своем вопросе. Например, вы можете запустить hg graft -D "2085::2093 and not 2091" только для копирования изменений с другой версии. Для сравнения, hg rebase (с или без --keep) будет захватывать любые изменения, которые вы указали, и все его изменений.

Также, rebase позволяет свернуть ревизии (с --collapse). Насколько я могу судить, graft нет.

Еще одна разница, которую я заметил: hg graft --edit 123 позволяет переделать ревизию 123 в рабочий каталог и отредактировать сообщение фиксации. Я не могу найти эквивалент hg rebase. Я должен отметить, однако, что hg histedit также позволяет редактировать сообщение фиксации при перезагрузке.

Возможно, существуют другие различия, о которых я не думаю. SO community: не стесняйтесь указывать их в комментариях, и я с радостью пересмотрю этот ответ, чтобы сделать его более полным.

См. the graft documentation и the Rebase Extension documentation для получения более подробной информации.

+0

Не 'hg rebase -rev" 2085 :: 2093, а не 2091 "' также позволяют "черрипик"? – Peter

+4

Graft будет копировать _and_ обратно в исходный набор изменений, что очень полезно при наборе вишни. Вы должны увидеть это, используя 'hg log --debug'. – Mathiasdm

+2

@Mathiasdm: Вы имеете в виду 'graft_source'? Не имеет ли rebase одно и то же с 'rebase_source'? – Peter

Смежные вопросы