cómo empujar un manojo de cambios como uno solo en mercurial

Según tengo entendido, una de las principales ventajas del sistema de control de revisiones distribuidas como Mercurial es que no debes preocuparte por romper algo en tu importante repository principal (que es utilizado por muchos otros desarrolladores), y hacer todo lo que trabajas e investiga en su clon remoto personal hasta que comprenda que todo es estable y puede hacer retroceder su trabajo. Y de ahí surgió mi pregunta: si es posible rechazar no todo su historial de cambios (con varias revisiones que usted mismo realizó), sino solo uno que es realmente diferente entre su repository y el estado actual del maestro.

Un ejemplo:

hg init master-repo; cd master-repo echo -e 'Important file\nWith Bug!' > file hg commit -A -m "initial commit" cd ..; hg clone master-repo hotfix-repo; cd hotfix-repo echo "fix1" >> file hg commit -m "first attempt to fix bug" echo "fix2" >> file hg commit -m 'Fixed it!' 

Ahora (posiblemente después de tirar y fusionar con los cambios más recientes en el repository principal), quiero retrotraer solo un set de cambios que contenga todos los cambios que he realizado sin mi historial de confirmaciones locales. Una posible solución es crear un clon más y luego usar diff / patch entre dos clones para extraer / aplicar los cambios desde el primero y asignarlos todos a la vez en el segundo repository. Luego empuje como en el caso normal. Pero, ¿es posible usar solo commands mercuriales?

Gracias en adelante!

Las opiniones difieren sobre si es bueno queuepsar sets de cambios de testing y error en un solo set de cambios antes de presionar:

  • Pros: evita tener sets de cambios en su historial donde falla su set de testings; esos sets de cambios son malos para hg bisect y añaden ruido.

  • Con: no puede queuepsar los sets de cambios que ha publicado en otros repositorys; al hacerlo, solo reescribiría sus sets de cambios locales y luego tendría que limpiar los otros repositorys manualmente.

Técnicamente, es perfectamente seguro queuepsar un set de sets de cambios en un único set de cambios antes de pulsar. Empiezas con

 ... a --- b --- c --- x --- y --- z 

y reescribes esto en

 ... a --- b --- c --- w 

donde w tiene exactamente el mismo estado de repository que z tenía (pero un set de cambios padre diferente, obviamente). No hay fusiones aquí (y por lo tanto no hay conflictos de fusión) por lo que no puede fallar.

Después de volver a escribir, puede tirar y fusionar con el flujo ascendente ( d e ):

 ... a --- b --- c --- w --- v \ / d ----- e 

Necesitas una extensión para hacer cualquier tipo de reescritura de la historia. Aquí sugeriría uno de:

  • Contraer extensión : como su nombre lo indica, esta extensión está dedicada a queuepsar sets de cambios.

  • Extensión Histedit : edición histórica completa, pero el command fold permite queuepsar sets de cambios.

  • Extensión de Rebase : esta extensión estándar puede mover sets de cambios y queuepsarlos al mismo time. En el ejemplo anterior, se movería x --- y --- z después de e :

     ... a --- b --- c --- d --- e --- x' --- y' --- z' 

    A continuación, puede queuepsar opcionalmente x' a z' :

     ... a --- b --- c --- d --- e --- w' 

    En comparación con el queuepso de x a z , el rebasado involucra fusiones por lo que puede fallar.

Introducción

Creo que reescribir la historia y enviar / get sets de cambios "pulidos" (en estilo Git-boys) es, en común, una mala idea: la historia es historia, tiene un valor propio.

Después de todo, para la twig "mainline" ( usa twigs , ¿no?), Todos sus cambios se presentarán como un mergeset , independientemente del conteo de los sets de cambios en la twig

Respuesta corta

No. En Mercurial, tiras / empujas y obtienes y aceptas un set completo de sets de cambios, lo que creó una diferencia en la historia del repository.

Respuesta larga

De alguna manera puedes hacerlo, rehaciendo tu historia de sets de cambios antes del intercambio al "otro lado". Solo recuerde: cada set de cambios no representa un nuevo estado de object, sino que difiere entre antiguo y actual (si lo describe en breve), por lo tanto, mediante cambios de eliminación ordinarios puede get un resultado final incorrecto.

De todos modos, tienes muchas forms de reescribir tu propio historial (como extensiones):

  • Colapso
  • Historia Editar
  • MQ (con mq-patches per se, foldsets de cambio en mq-patch y split de la misma manera)
  • Tal vez algunos otros, desconocido para mí