¿Cómo especifico una combinación de bases para usar en una fusión 'hg'?

Estoy tratando de hacer una fusión complicada en un repository de hg complicado. No estoy contento con el "ancestro compartido más nuevo" que Mercurial elige utilizar como la "base" para realizar la fusión.

Me gustaría especificar un compromiso específico de mi propia elección para usar como base.

¿Es posible? y si lo es, cómo?

Mercurial 3.0: ahora puede seleccionar el ancestro para usarlo como base de combinación. Lo haces al establecer merge.preferancestor . Mercurial te lo contará cuando tenga sentido. Con el ejemplo a continuación, verá:

 $ hg merge note: using eb49ad46fd72 as ancestor of 333411d2f751 and 7d1f71140c74 alternatively, use --config merge.preferancestor=fdf4b78f5292 merging x 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit) 

Mercurial antes de la versión 3.0: Lazy Badger tiene razón en que no puedes elegir el antepasado elegido por Mercurial cuando lo usas desde la línea de command. Sin embargo, puede hacerlo internamente y no es demasiado difícil escribir una extensión para esto:

 from mercurial import extensions, commands, scmutil from mercurial import merge as mergemod saved_ancestor = None def update(orig, repo, node, branchmerge, force, partial, ancestor=None): if saved_ancestor: ancestor = scmutil.revsingle(repo, saved_ancestor).node() return orig(repo, node, branchmerge, force, partial, ancestor) def merge(orig, ui, repo, node=None, **opts): global saved_ancestor saved_ancestor = opts.get('ancestor') return orig(ui, repo, node, **opts) def extsetup(ui): extensions.wrapfunction(mergemod, 'update', update) entry = extensions.wrapcommand(commands.table, 'merge', merge) entry[1].append(('', 'ancestor', '', 'override ancestor', 'REV')) 

Pon esto en un file y carga la extensión. Ahora puedes usar

 hg merge --ancestor X 

para anular el ancestro normal. Como has descubierto, esto hace la diferencia si hay varios antepasados ​​posibles. Esa situación surge si tienes fusiones cruzadas. Puede crear un caso así con estos commands:

 hg init; echo a > x; hg commit -A -max hg update 0; echo b >> x; hg commit -mb hg update 0; echo c >> x; hg commit -mc hg update 1; hg merge --tool internal:local 2; echo c >> x; hg commit -m bc hg update 2; hg merge --tool internal:local 1; echo b >> x; hg commit -m cb 

El gráfico se ve así:

 @ changeset: 4:333411d2f751 |\ +---o changeset: 3:7d1f71140c74 | |/ | o changeset: 2:fdf4b78f5292 | | o | changeset: 1:eb49ad46fd72 |/ o changeset: 0:e72ddea4d238 

Si se fusiona normalmente, obtiene el set de cambios eb49ad46fd72 como ancestro y el file x contiene:

 a c b c 

Si en cambio usas hg merge --ancestor 2 obtienes un resultado diferente:

 a b c b 

En ambos casos, mi KDiff3 pudo manejar la fusión automáticamente sin informar ningún conflicto. Si utilizo la estrategia de fusión "recursiva" y selecciono e72ddea4d238 como ancestro, entonces se me presenta un conflicto sensible. Git usa la estrategia de fusión recursiva por defecto.

La base solo se usa como otra input para su herramienta de combinación. Si desactiva premerge en la configuration de Merge Tool (premerge realiza las "elecciones obvias" para usted cuando no haya conflictos) e invoque su herramienta de fusión manualmente proporcionando copys de las 3 revisiones que desee como local, remota y base, puede get lo que quieras en tu herramienta de fusión. Solo el padre izquierdo y el padre derecho se registran realmente en la combinación.

No puedes hacerlo Porque el ancestro compartido más nuevo ES una base real para su fusión

Si desea realizar la fusión y no desea volver a pensar (debido a que su base de lógica muestra / me / suposiciones erróneas y ruta de la solución) puede ir a clone-rebase-merge-export-import ruta de parche