Как я могу выбрать одну ревизию в Mercurial?

в Mercurial / TortoiseHg, учитывая следующий пример, каков самый простой способ объединить ревизию "G" в репо A,не принимая D,E и F (предположим, что G не зависит от D, E или F).

Repo A: A - B - C

Repo B (Clone of A) A - B - C - D - E - F - G

патч лучше всего ставить?

2 ответов


тонфа права. То, что вы описываете, не "сливается" (или "толкает" или "тянет"); это "сбор вишни". Толчок или тяга перемещает все наборы изменений из одного РЕПО в другое, которые еще не находятся в этом РЕПО. "Слияние" берет две "головы" и объединяет их в новый набор изменений, который является комбинацией обоих.

Если вам действительно нужно переместить G, но вы не можете вынести наличия D, E, F, вы должны "экспортировать hg" G из РЕПО A, а затем "импортировать hg" его в репо A. расширение пересадки - это обертка вокруг экспорта / импорта с некоторыми тонкостями, чтобы избежать перемещения одного и того же набора изменений несколько раз.

, недостаток использования импорта / экспорта, трансплантации и сбора вишни в целом заключается в том, что вы не можете перемещаться по G без его предков, потому что в Mercurial набор изменений имя его 'hashid', который включает в себя hashids своих родителей. Разные родители (новым родителем G будет C и не F) означает другой хашид, поэтому это больше не G-это работа G, а новый набор изменений по имени.

перемещение по G как что-то новое, назовем это G' (Gee prime), не имеет большого значения для некоторых применений, но для других это большая Пита. Когда скоро repo B get's новый набор изменений, H, и вы хотите переместить его над своим родителем, будет меняться с G на G', которые имеют разные хэши. Это означает, что ч будут перемещаться как H' -- 100 правок вниз по линии и вы будете иметь различные hashids за все, потому что вы не могли вынести иметь D,E, F в репо A.

вещи получат еще больше от удара, если/когда вы хотите переместить вещи из РЕПО A в репо B (противоположное направление вашего предыдущего движения). Если вы попытаетесь сделать простой "HG push" от A до B, вы получите G "(и H " и последующими потомками), которые будут дубликатами наборов изменений, которые у вас уже есть в репо B.

что тогда, ваши варианты?

  1. не уход. ваши данные все еще там, вы просто получаете те же наборы изменений с разными именами и больше работы над будущими обменами между двумя репозиториями. Это не неправильно, это просто немного неуклюже, и некоторым людям все равно.
  2. переместить все D, E и F на Repo A. вы можете переместить все наборы изменений, если они безвредны и избежать всех хлопот. Если они не настолько безвредны, вы можете переместить их, а затем сделать "HG backout", чтобы отменить эффекты D, E и F в новом наборе изменений H.
  3. дайте G лучшее происхождение для начала. для меня это означает упомянуть об этом, потому что слишком поздно идти по этому маршруту (без редактирование истории). Что ты!--13-->должны сделали перед работой над набором изменений G было hg update C. Если G не полагается или не требует наборов изменений D,E и F, то это не должен быть их ребенок.

если вместо этого вы сначала обновите до C, у вас будет график, такой как это:

A - B - C - D - E - F
          \
            G

затем и весь ответ на этот вопрос будет просто hg push -r G ../repoA и G будет двигаться чисто, сохраняя тот же самый гашид, А D, E и F не пойдут с ним.

обновление:

как указано в комментариях. С современными Mercurials hg graft команда-идеальный способ сделать это.


ссылаясь на название, которое касается сбора вишни в целом, я приведу пример работы в одном РЕПО, поскольку интернет-поисковые системы могут привести людей сюда для сбора вишни в целом. Работая в одном репозитории, это будет сделано с помощью hg graft:

hg update C
hg graft G

результат:

            G'
          / 
A - B - C - D - E - F - G

дополнительное предупреждение: два набора изменений будут рассматриваться как независимые, параллельные фиксации в одних и тех же файлах и могут привести к конфликтам слияния, именно поэтому сбор вишни следует избегать в целом для управления филиалом. Например, если G Исправлена ошибка, примененная к стабильной версии ветви закладки как 1.0.1, вы должны вместо слияние the freeze ветку с ним, и время от времени сливать master филиала с филиала.