2009-01-15 24 views
74

... 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 entre sucursales (branch, update -C).mejores prácticas en mercurial: rama vs. clon y fusiones parciales?

Tengo dos preguntas importantes aunque:

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

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

    a. si tengo que actuar sobre dos versiones/ramas a la vez (por ejemplo, hacer un diff de medición de rendimiento)

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

    c. para hacer la elección & elegir fusionar como he mencionado anteriormente.

Respuesta

50

utilizo clon para:

  • ramas locales de vida corta
  • clonación para diferentes máquinas de desarrollo y servidores

El uso anterior es bastante raro para mí - sobre todo cuando estoy intentando una idea que podría querer 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 los cambios de 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 sucursales de características, o ramas de vida más larga, utilizo 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 yo lo veo de esta manera:

  • ramas nombradas son para el desarrollo de las distintas ramas o versiones de la aplicación
  • Los clones son para la gestión de 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.

+3

¿por qué se aceptó y votó tantas veces cuando claramente se perdió el objetivo de la pregunta? No responde 1 y tampoco responde 2, mientras que la respuesta de Steve va directo al grano. – mare

+3

@mare hopfully porque OP lo encontró útil. A veces hay más de una perspectiva sobre una pregunta, y stackoverflow está diseñado para permitir que la respuesta que más aborda el problema del OP reciba crédito (al ser aceptado) y la respuesta más útil para que la comunidad obtenga crédito (a través de votos ascendentes). Una respuesta útil no es * siempre * la respuesta más directa, siempre que aborde la razón subyacente detrás de la pregunta. En este caso, las personas me han hecho preguntas similares en la vida real y la información que he compartido aquí es lo que encontraron más útil, así que pensé que también podría ser útil aquí. – Draemon

+1

@mare, voté esto porque llegué a esta página a través de Google y resolvió * mi * pregunta. –

3

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

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 ...?

+2

Tengo que decir que a pesar de querer amar a MQ y parecer una gran idea, en la práctica los encontré completamente inviables. Trabajar en dos máquinas diferentes fue una molestia: quitar una gran ventaja del control de la fuente. – Draemon

+0

Esta ha sido mi queja. Aún no puede agregar el archivo ./.hg/patches en su archivo ./.hgsub. Uso MQ cuando tengo personalizaciones para un cliente específico además de algo genérico, pero luego termino con varias carpetas de parches nombradas (patch-clienta, patch-clientb, etc.). Esto está bien para mí trabajando solo, pero aún me cuesta ver cómo podemos integrar MQ cómodamente en mi trabajo diario. La clonación podría significar clonar el repositorio principal y 3 o 4 repositorios de cola de parche. – bobpaul

29

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, de los archivos en una rama diferente a esta".

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

Si se refiere el punto 2, deberá hacer lo siguiente:

  • actualización de la rama que desea tirar de los cambios en.
  • Utilice hg revert -r <branch you want to merge> --include <files to update> para cambiar el contenido de esos archivos a la forma en que están en la otra rama.
  • Utilice hg commit para confirmar esos cambios en la rama como un nuevo conjunto de cambios.

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

Cuestiones relacionadas