Как мне выбрать одну ревизию в 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 68

2 ответа:

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

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

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

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

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

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

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

обновление:

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

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

hg update C
hg graft G

результат:

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

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