2012-02-06 14 views
6

Después de preguntar this question ayer sobre la bifurcación en mercurial, he decidido probar marcadores para ramas efímeras (características), como se muestra a continuación.
Sin embargo ahora, cuando estoy tratando de fusionar mis cabezas marcadas juntos en el desarrollo de la revisión, me sale error a continuación:Fusionando marcadores en mercurial

hg update dev-1.1 
hg merge feature1 
abort: nothing to merge 

¿Qué estoy haciendo mal?

Representación gráfica de mi repo:

o changeset: 5:fa2b19961b46 
| bookmark: feature1 
| description: Work on feature 1 finished. 
| 
| o changeset: 4:6ea0155d4d89 
| | bookmark: feature2 
| | description: Work on feature 2 started. 
| | 
o | changeset: 3:44e335b5426c 
| | bookmark: feature1 
|/ description: Work on feature#1 started. 
| 
@ changeset: 2:407b3b94624f 
| tag:   dev-1.1 
| description: Development for release 1.1 started. 

Respuesta

11

Como él dice, no hay nada que fusionar - usted debe utilizar la actualización en su lugar:

$ hg update feature1 

Sólo se pueden fusionar partes divergentes de la historia, y aquí el conjunto de cambios dev-1.1 es simplemente un antecesor del conjunto de cambios feature1. Mercurial 2.1 dice

$ hg merge feature1 
abort: nothing to merge 
(use 'hg update' or check 'hg heads') 

en este caso y esperamos que esto aclare el error.

Si había marcado el conjunto de cambios dev-1.1 (en lugar de etiquetar), entonces una llanura

$ hg update 

ahora (con Mercurial 2.1) dan como resultado una actualización del dev-1.1 marcador. Así que si usted comienza con

$ hg bookmarks 
* dev-1.1     0:b1163a24728f 
    feature1     3:c84f04513651 
    feature2     2:e60dd08af282 

y luego actualizar:

$ hg update 
2 files updated, 0 files merged, 0 files removed, 0 files unresolved 
updating bookmark dev-1.1 

entonces el marcador se actualización:

$ hg bookmarks 
* dev-1.1     3:c84f04513651 
    feature1     3:c84f04513651 
    feature2     2:e60dd08af282 

Con las versiones anteriores, que tendría que hacer

$ hg update feature1 
$ hg bookmark -f dev-1.1 

Esto todavía se aplica si unsimpleno lo lleva al conjunto de cambios correcto, por ejemplo, si hubiera deseado "fusionarse" con feature2.


La idea de utilizar fusionar cuando la historia realmente no ha divergido proviene de Git. En ese sistema, existe la noción de una fusión de avance rápido , que es lo que llamamos una actualización en Mercurial.

+0

Oh.Entonces, ¿necesito ejecutar 'hg update feature1 && hg merge feature2' y así sucesivamente para cada función que desciende de' dev-1.1'-revision? – Industrial

+1

Fusionar 'feature1' y' feature2' es una cuestión diferente. Pero sí, cuando las características se hacen en paralelo (como en su caso), entonces necesita fusionarlas en su pista 'dev-1.1'. Si solo tenía 'feature1', entonces no hay desarrollo paralelo en marcha y entonces' hg update' es la respuesta correcta. –

+0

No ayuda (al menos en mercurial 2.7), 'hg merge --preview feature1' listará todos los conjuntos de cambios apropiados ... pero luego la combinación real seguirá produciendo el error que se discute aquí. –

3

Si los conjuntos de cambios se han hecho públicas, puede forzar a Mercurial hacer una combinación si desea insistir en que cada característica como una fusión en el repositorio:

$ hg update feature1 
$ hg debugsetparents dev-1.1 feature1 
$ hg commit -m 'Feature 1 reviewed by me.' 
$ hg bookmark -d feature1 

Si no se han hecho los conjuntos de cambios público, puede colapsar los conjuntos de cambios en uno:

$ hg update feature1 
$ hg rebase --dest dev-1.1 --collapse 
$ hg bookmark -d feature1