"Nada para fusionar" con hg merge

Estoy tratando de convertir DVCS a Mercurial. He encontrado una situación en la que Mercurial no me deja hacer algo que el otro DVCS considera perfectamente razonable.

Parece que en el repository, uno de los usuarios tiene el hábito de trabajar así:

  • tenedor
  • trabaja en la horquilla
  • fusionar el tronco -> tenedor
  • testing
  • fusionar tenedor -> tronco

Eso todo parece perfectamente razonable. Excepto que si trunk no ha avanzado mientras el usuario estaba probando, hg se niega a hacer la fusión final, con 'abortar: nada que fusionar'. --force no ayuda.

Puedo replicar esto con el siguiente caso de testing:

 echo "Test data" > file hg add file hg commit file -m "Ancestor" # rev 0 echo "Trunk" > file hg commit file -m "Trunk" # rev 1 hg checkout 0 echo "Branch" > file hg commit file -m "Branch" # rev 2 hg merge --tool internal:local 1 hg commit -m "Merge trunk to branch" # rev 3 hg checkout 1 hg merge --tool internal:local 3 # <--- fails hg commit -m "Merge branch to trunk" 

Si modifico la testing para que el tronco avance entre las dos fusiones, entonces en la troncal de fusión final ahora hay una nueva revisión 4 y la revisión 3 se fusiona en ella, todo funciona bien.

Obviamente, se trata de un flujo de trabajo perfectamente estándar. Lo hago yo mismo. Entonces, ¿por qué no está funcionando?

Actualizar:

Este caso de testing funciona:

 echo "Test data" > file hg add file hg commit file -m "Ancestor" hg branch trunk # rev 0 echo "Trunk" > file hg commit file -m "Trunk" # rev 1 hg checkout 0 hg branch branch echo "Branch" > file hg commit file -m "Branch" # rev 2 hg merge --tool internal:local 1 hg commit -m "Merge trunk to branch" # rev 3 hg checkout 1 hg merge --tool internal:local 3 hg commit -m "Merge branch to trunk" 

Este es exactamente el mismo código que el primer caso de testing, excepto que el tronco y la bifurcación están ahora explícitamente ramificados en lugar de usar cabezas ad-hoc. Todas las fusiones y salidas utilizan las mismas revisiones que antes. Aparentemente las twigs son mágicas.

Lamentablemente, no puedo usar twigs en el código real, porque el otro DVCS usa cabezales ad-hoc, ninguno de los cuales tiene información de twig. No quiero tener que falsificar una twig para cada tenedor.

¿Cómo puedo persuadir a Mercurial para que me permita hacer esto sin usar twigs explícitas?

La Revisión 3 es un ancestro directo de la revisión 1. No hay cambios simultáneos para fusionar aquí. Todo lo que necesitas hacer es hg update 3 .

Merge se aplica cuando tiene dos twigs divergentes y desea recostackr cambios de ambos lados en una nueva versión común. En ese caso, necesita una fusión de tres vías entre las dos versiones divergentes (usando información de los antepasados ​​más comunes)

En su caso, hay dos versiones divergentes, sin ancestros comunes, solo una versión anterior y una nueva versión de su file. Solo quiere usar la hg update (la update es el command oficial para moverse, el checkout es un alias)

No sé por qué este otro DVCS te confundió al llamar a "fusionar" algo que no implica ninguna fusión.

(nota: considere usar hg log -G para una salida gráfica de su gráfico)

(otra nota: nunca use merge –force esta es una bandera obsoleta vieja haciendo tonterías. Está oculta de la hg help merge por una buena razón)