2010-11-03 20 views
12

¿Hay una manera simple de verificar si una combinación/rebase generará conflictos de archivos, sin realizar realmente la combinación/rebase?¿Cómo verifico posibles conflictos de fusión/rebase en Mercurial?

Quiero ser capaz de decidir si:

  • rebase si el conjunto de archivos tocado (el mío frente a ellos) son diferentes
  • se funden si nosotros hemos estado con los mismos archivos.

ya que una mala combinación (causada por la resolución de conflictos de manera equivocada por error humano) es más fácil de detectar y revertir si hago una fusión de dos cabezas, en lugar de haber hecho rebase. Especialmente si presiono mis cambios y luego me di cuenta de que algo estaba mal.

(No siempre es posible verificar todo de antemano, ya que no contamos con un conjunto de pruebas totalmente completo).

Y .. Estoy ejecutando Windows. :)

Respuesta

11

Entonces, con algo de ayuda de la respuesta de Martin, he encontrado la extensión rebaseif, que hace lo que quiero.

Básicamente, intenta rebase utilizando la herramienta de combinación interna, si eso falla (lo que hace para cualquier conflicto), aborta y se fusiona con la herramienta preferida del usuario.

Ver https://bitbucket.org/marcusl/ml-hgext/src/tip/rebaseif.py para más detalles.

actualización

En los últimos meses, he vuelto a simplemente hacer una fusión, ya que es intrínsecamente seguro. Una rebase sin conflicto aún podría arruinar las cosas, ya que los archivos dependientes pueden afectar el cambio. (es decir, una rebase pierde información sobre cómo se veía el código antes de la fusión).

Como el autor de rebaseif, recomiendo utilizar la combinación simple antigua en su lugar. :)

+0

Extensión impresionante. –

+2

... Que el autor no confía. :-) +1 a Macke por decirlo. -1 a las personas que tienen más confianza en algo que su autor. –

3

se puede ver si dos conjuntos de cambios, REV1 y REV2, afectar a cualquiera de los mismos archivos que hacen algo como:

(hg status --change REV1 --no-status ; hg status --change REV2 --no-status) | sort | uniq --repeated 

Si eso tiene ninguna salida, entonces el mismo archivo se toca en los dos revisiones.

que podría hacer fácilmente un script de shell como:

#!/bin/sh 
(hg status --change $1 --no-status ; hg status --change $2 --no-status) | sort | uniq --repeated 

que podría ser ejecutado como cualquiera de los siguientes:

./find_overlaps c8f7e56536ab d9e2268e20b9 
./find_overlaps 1 33 

Si realmente quería conseguir la suposición que podría modificar la secuencia de comandos para ejecute automáticamente merge o rebase dependiendo de si se encontraron o no líneas.

Si está en windows mi dios lo ayude. :)

+0

Tengo Python en Windows, así que puedo escribir fácilmente un script que hace precisamente eso. Hubiera sido bueno como un plugin sin embargo. :) – Macke

+0

Esto no parece hacer exactamente lo que quiero. Necesito verificar un conjunto completo de revisiones, para determinar si dos ramas anónimas contienen conflictos, todo el camino hasta su ancestro común, no solo verificar dos revisiones. – Macke

+0

Puede instalar Cygwin en Windows. :-) Sombras de GIT, ¿eh? –

4

No hay ninguna razón para utilizar hg merge si los cambios se superponen y hg rebase de lo contrario ya hg rebase hacen una fusión interna y le permitirá resolver usando las mismas herramientas que hg merge.

Como para probar si una fusión o rebase causará conflictos, entonces usted puede utilizar

$ hg merge --tool internal:merge 

en Mercurial 1.7 para anular su merge tool configuration normales. (La parte --tool internal:merge es nueva, utilice --config ui.merge=internal:merge en versiones anteriores de Mercurial.)

Tras la fusión,

$ hg resolve --list 

le dirá los resultados y que se pondrá en contacto al punto de partida con

$ hg update --clean . 
+5

Mi razón para elegir es que una fusión incorrecta (causada por la resolución de conflictos de forma incorrecta por error humano) es más fácil de detectar e invertir si hago una combinación de dos caras, en lugar de haber hecho una rebase. Especialmente si presiono mis cambios y luego me di cuenta de que algo estaba mal. (No siempre es posible verificar todo de antemano, ya que no contamos con un conjunto de pruebas totalmente completo). ¿Crees que mi caso de uso tiene sentido en ese contexto? – Macke

+1

Marcus: Creo que es una razón interesante y válida para preferir las fusiones. Nunca antes había pensado en la diferencia de esa manera. –

Cuestiones relacionadas