mercurial merge branch

las mejores prácticas en mercurial: rama vs. clon y fusiones parciales?



merge branch (3)

... así que me he acostumbrado a las cosas simples con Mercurial ( add , commit , diff ) y me enteré del archivo .hgignore (¡yay!) y me he acostumbrado a crear y cambiar de branch ( branch , update -C ).

Sin embargo, tengo dos preguntas principales:

  1. Si estoy en la rama "Branch1" y quiero incluir algunos, pero no todos, los cambios de la rama "Branch2", ¿cómo lo haría? Particularmente si todos los cambios están en un subdirectorio. (Creo que podría simplemente clonar todo el repositorio, luego usar una herramienta de combinación de directorios como Beyond Compare para elegir mis ediciones. Parece que debería haber una forma de aislar los cambios en un archivo o directorio).

  2. Cambiar de una rama a otra con una update -C parece tan fácil, me pregunto por qué me molestaría en utilizar clone . Solo puedo pensar en algunas razones (ver a continuación). ¿Hay alguna otra razón por la que me estoy perdiendo?

    a. si necesito actuar sobre dos versiones / ramas a la vez (por ejemplo, hacer una diferencia metric-performance)

    segundo. para una copia de seguridad ( clone el repositorio en una unidad de red en una ubicación físicamente diferente)

    do. para hacer la elección y elegir fusionar como he mencionado anteriormente.


Para la pregunta 1, debe ser un poco más claro sobre lo que quiere decir con "cambios". ¿A cuál de estos quiere decir?

  1. "Quiero sacar algunos, pero no todos, los conjuntos de cambios en una rama diferente a esta".
  2. "Quiero extraer la última versión de algunos, pero no todos, los archivos en una rama diferente a esta".

Si te refieres al ítem 1, deberías consultar la extensión de Transplant , específicamente la idea de buscar un par de conjuntos de cambios.

Si te refieres al ítem 2, harías lo siguiente:

  • Actualice a la sucursal en la que desea realizar los cambios.
  • Use hg revert -r <branch you want to merge> --include <files to update> para cambiar los contenidos de esos archivos a la forma en que están en la otra rama.
  • Use hg commit para confirmar esos cambios en la rama como un nuevo conjunto de cambios.

En cuanto a la pregunta 2, nunca uso clones de repositorio para ramificarme, así que no sé. Utilizo ramas con nombre o ramas anónimas (a veces con marcadores).


Tengo otra opción para que investigue: colas mercuriales.

La idea es tener una pila de parches (sin confirmaciones, parches "reales") en la parte superior de su directorio de trabajo actual. Luego, puede agregar o eliminar los parches aplicados, agregar uno, eliminarlo, agregar otro, etc. Un solo parche o un subconjunto de ellos termina siendo una nueva "característica", como probablemente quiera hacer con las ramas. Después de eso, puede aplicar el parche como de costumbre (ya que es un cambio). Las ramas son probablemente más útiles si trabajas con alguien más ...?


Yo uso clon para:

  • Ramas locales de corta vida
  • Clonación en diferentes máquinas y servidores de desarrollo

El uso anterior es bastante raro para mí, principalmente cuando intento una idea que deseo abandonar por completo. Si deseo fusionarme, deseo fusionar TODOS los cambios. Este tipo de ramificación es principalmente para rastrear ramas de diferentes desarrolladores para que no se molesten entre sí. Solo para aclarar este último punto:

  • Sigo trabajando en mis cambios y obtengo cambios en mis compañeros desarrolladores y ellos extraen los míos.
  • Cuando sea conveniente para mí fusionaré TODOS los cambios de una (o todas) de estas ramas en la mía.

Para las ramas de características, o las ramas de vida más larga, uso ramas con nombre que se comparten más cómodamente entre repositorios sin fusionar. También "se siente" mejor cuando desea fusionarse selectivamente.

Básicamente lo veo de esta manera:

  • Las sucursales con nombre son para desarrollar diferentes ramas o versiones de la aplicación
  • Los clones son para administrar diferentes contribuciones a la misma versión de la aplicación.

Esa es mi opinión, aunque en realidad es una cuestión de política.