2012-04-23 7 views
11

Tenemos dos cabezas. Uno es nuestro jefe de desarrollo principal y el otro es uno que olvidé hasta el día de hoy. Encontramos un error y lo arreglamos en nuestra rama principal de desarrollo, y me di cuenta de que también debería arreglarse en la rama más antigua.¿Flujo de trabajo para "backport" cambiar en diferentes ramas Mercurial (Hg)?

Creo que hubiera sido mejor hacer el cambio en la rama anterior y fusionarlo con la rama actualizada, pero no lo hicimos de esa manera. ¿Puede mercurial manejar esto? No hemos intentado hacer algo como esto y realmente no puedo entender cómo se haría.

+0

http://stackoverflow.com/questions/854930/mercurial-cherry-picking-changes-for-commit – zerkms

+1

Me resulta más fácil si la "rama de desarrollo principal" es en sí misma un árbol, donde los cambios son diferentes en sí mismos ("anónimo") ramas que crecen y luego vuelven a ponerse en ... –

+3

(no es una respuesta, de ahí el comentario) * "Creo que hubiera sido mejor hacer el cambio en la rama anterior" * ...Es * posible * que haya sido incluso mejor aplicar esa corrección de errores como una "corrección de daggy": se retrocede al lugar donde se introdujo el error, se compromete la solución y se fusiona en sentido ascendente. Aplicarlo "lo antes posible" * puede * incluso ser mejor que aplicarlo primero a su "rama anterior" (lo que sea que sea). Para pequeñas correcciones de errores daggy fix hacer totalmente rock (en mi humilde opinión): http://mercurial.selenic.com/wiki/DaggyFixes – TacticalCoder

Respuesta

14

Sí, tiene dos buenas opciones:

injerto: en nuevos Mercurial 2.0

Esta versión introdujo el graft command que puede acondicionarlo cambios de una manera inteligente. La "inteligencia" es que va a utilizar fusiones internamente y esto significa que se obtiene

  • Soporte para renombrado: Imagínese que usted ha solucionado el error en el archivo foo.c en la rama de desarrollo. En la rama de mantenimiento anterior foo.c se llamaba bar.c. Con hg graft, el cambio a foo.c se puede combinar correctamente en el antiguo bar.c.

  • Combinación de tres vías: Injerto implica twisting the graph around y la fusión en ese gráfico temporal. La ventaja de las combinaciones a tres bandas es que puedes usar tu herramienta de fusión gráfica normal para resolver conflictos.

Para copiar la punta de default en old-branch sólo tiene que ejecutar

$ hg update old-branch 
$ hg graft default 

Trasplante: las versiones anteriores

Antes de tener el comando del injerto, la transplant extension era el camino a seguir. Esta simple extensión exportará un conjunto de cambios como un parche y tratará de aplicar el parche a alguna otra revisión.

Como estamos tratando con parches "tontos", no se tendrán en cuenta los cambios de nombre, por ejemplo, y no obtendrá soporte para su herramienta de combinación, ya que no existe una combinación de tres vías. A pesar de esto, he descubierto que el trasplante funciona muy bien en la práctica.

El uso de trasplante es simple:

$ hg update old-branch 
$ hg transplant default 

Esto es muy cerca de quedarse

$ hg update old-branch 
$ hg export default | hg import - 

excepto que el trasplante también añade un trozo de meta datos que registra el conjunto de cambios original en el conjunto de cambios trasplantado. Esto se puede usar para omitir trasplantes futuros.

Cuestiones relacionadas