¿Cómo selecciono una sola revisión en Mercurial?


En Mercurial/TortoiseHg, dado el siguiente ejemplo, cuál es la forma más fácil de fusionar la revisión "G" en repo A sin tomar D,E y F (Supongamos que G no tiene dependencia de D,E o F).

Repo A: A - B - C

Repo B (Clone of A) A - B - C - D - E - F - G

Es un parche, la mejor apuesta?

Author: David Pettersson, 2009-11-03

2 answers

Tonfa tiene razón. Lo que estás describiendo no es 'fusionar' (o 'empujar' o 'tirar'); es 'elegir'. Un push o un pull mueve todos los conjuntos de cambios de un repositorio a otro que no están ya en ese repositorio. Un 'merge' toma dos 'heads' y los fusiona en un nuevo conjunto de cambios que es la combinación de ambos.

Si realmente necesita mover G pero no puede soportar tener D,E, F allí, debe 'exportar hg' G desde el repositorio A, y luego 'importar hg' en el repositorio A. El Transplant extension es una envoltura alrededor de la exportación/importación con algunas sutilezas para ayudar a evitar mover el mismo conjunto de cambios varias veces.

Sin embargo, el inconveniente de usar import/export, transplant y cherry-picking en general es que realmente no se puede mover sobre G sin sus ancestros, porque en Mercurial el nombre de un conjunto de cambios es su 'hashid' que incluye los hashid de sus padres. Padres diferentes (el nuevo padre de G sería C y no F) significa a hashid diferente, así que ya no es G's es el trabajo de G sino un nuevo conjunto de cambios por nombre.

Moverse sobre G como algo nuevo, llamémoslo G' (Gee prime), no es un gran problema para algunos usos, pero para otros es una gran pita. Cuando pronto repo B consigue un nuevo conjunto de cambios, H, y desea moverlo sobre su padre va a cambiar de G a G', que tienen diferentes hashes. Eso significa que H se moverá como H ' chang 100 conjuntos de cambios en la línea y tendrás diferentes hashids para todo todo porque no podías soportar tener D,E, F en repo A.

Las cosas se descontrolarán aún más si/cuando quieras mover cosas del Repositorio A al Repositorio B (la dirección opuesta a tu movimiento anterior). Si intentas hacer un simple 'hg push' de A a B obtendrás G' (y H' y por descendientes posteriores) que serán duplicados de los conjuntos de cambios que ya tienes en Repo B.

¿Cuáles son entonces sus opciones?

  1. No me importa. Sus datos todavía están ahí que acaba de terminar con los mismos conjuntos de cambios con diferentes nombres y más trabajo en futuros intercambios entre los dos repositorios. No está mal, es sólo un poco torpe tal vez, y a algunas personas no les importa.
  2. Mueva todos los conjuntos de cambios D,E y F al Repositorio A. Puede mover todos los conjuntos de cambios si son inofensivos y evitar toda la molestia. Si no son tan inofensivos,puedes moverlos y luego hacer un 'hg backout' para deshacer los efectos de D, E y F en un nuevo conjunto de cambios H.
  3. Dar G mejor parentesco para empezar. Es malo para mí mencionar esto porque es demasiado tarde para seguir este camino (sin editar el historial). Lo que debería haber hecho antes de trabajar en el conjunto de cambios G era hg update C. Si G no depende o requiere conjuntos de cambios D, E y F, entonces no debería ser su hijo.

Si en cambio actualizas a C primero tendrás un gráfico como este:

A - B - C - D - E - F
          \
            G

Entonces, la respuesta completa a esta pregunta sería simplemente hg push -r G ../repoA y G se movería limpiamente, mantener su mismo hashid, y D, E y F no iría con él.

ACTUALIZACIÓN:

Como se señala en los comentarios. Con Mercuriales modernos el comando hg graft es la manera perfecta de hacer esto.

 76
Author: Ry4an Brase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-22 10:03:14

Refiriéndose al título, que aborda la selección de cereza en general, doy el ejemplo de trabajar en un repositorio, ya que los motores de búsqueda en Internet podrían traer a la gente aquí para la selección de cereza en general. Trabajando en un repositorio, se haría con hg graft:

hg update C
hg graft G

El resultado es:

            G'
          / 
A - B - C - D - E - F - G

Advertencia adicional: Los dos conjuntos de cambios se tratarán como confirmaciones independientes y paralelas en los mismos archivos y podrían provocar conflictos de fusión, por lo que la selección de cherry debería evitar en general para la gestión de sucursales. Por ejemplo, si G es una corrección de errores aplicada a una rama de versión estable marcada como 1.0.1, debería combinar la rama freeze con ella, y de vez en cuando combinar la rama master con las correcciones de errores de la rama freeze.

 38
Author: Iodnas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-27 17:04:32