version-control - tutorial - mercurial software version control
¿Cómo puedo anular una fusión en Mercurial y luego volver a mezclar con esa rama? (6)
Hicimos un experimento con ''hg backout'', retrocediendo la fusión (no estoy seguro de que esta sea la forma correcta de hacerlo). Luego, los cambios de branch1 se eliminan de forma predeterminada, lo cual está bien, pero no podemos volver a medir con branch1.
Yo uso el retroceso para cancelar la fusión. No se puede volver a marcar, pero se puede "retroceder en la combinación de retroceso", es decir, cuando se quiere volver a mezclar, se hace ''hg backout'' en el "Sin copia de la combinación de cambios del conjunto de cambios ..." y luego se vuelve a combinar la rama.
Ejemplo:
7 M remerge
6 / /
5 * | hg backout 3 (backout backout)
4 | * fix error
3 * | hg backout 2
2 M | fail merge
/ /
1 * *
| |
Tengo dos ramas, por defecto y rama1. Por error, una persona de nuestro equipo fusionó branch1 con el valor predeterminado. El contenido en Branch1 aún no está listo para fusionarse con el valor predeterminado (contiene una importante revisión del entorno de compilación e implementación).
Hicimos un experimento con ''hg backout'', retrocediendo la fusión (no estoy seguro de que esta sea la forma correcta de hacerlo). Luego, los cambios de branch1 se eliminan de forma predeterminada, lo cual está bien, pero no podemos volver a medir con branch1.
¿Cómo deberíamos resolver este problema?
Gracias a todos por el gran aporte! Como teníamos prisa por resolver el problema, y nuestro grupo es relativamente nuevo en Mercurial, utilizamos una solución muy pragmática.
En nuestro servidor de repositorios creamos un nuevo repositorio, luego clonamos el repositorio anterior hasta la revisión justo antes de la fusión. Luego empujó el nuevo clon al servidor y envió el nuevo enlace a todos. Por suerte somos un equipo de desarrollo bastante pequeño.
Quizás no sea la forma más sencilla de resolver el problema, pero funcionó :)
Hay muchos escenarios aquí donde podría querer hacer esto, haré de cada escenario un titular, para que pueda encontrar el escenario que se ajuste a su caso. Tenga en cuenta que todavía estoy aprendiendo Mercurial, y me gustaría recibir sugerencias si algo de lo que digo es incorrecto, usando la terminología incorrecta, podría hacerse mejor, etc.
No hay más cambios, no se comparte ni se fusiona (no se empuja / tira)
El programador se ha fusionado, pero no ha hecho nada más, ni ha compartido los cambios con nadie, de ninguna manera.
En este caso, simplemente descarte el clon local y obtenga un clon nuevo de un repositorio seguro.
Cambios locales sobre la combinación, no compartidos
El programador se ha fusionado y ha seguido trabajando basado en esa fusión. Los conjuntos de cambios que siguieron a la combinación deben mantenerse, pero la combinación en sí debe eliminarse. Los cambios (fusionar + siguientes conjuntos de cambios) no se han compartido con nadie.
En este caso yo haría una de cuatro:
- Intente usar la extensión REBASE, esto moverá los conjuntos de cambios de una ubicación a otra. Si los conjuntos de cambios se basan en cambios de código que se introdujeron con la combinación, se debe realizar un trabajo manual para reconciliar las diferencias.
- Trate de usar la extensión MQ para juntar los conjuntos de cambios que se guardarán en una cola de parches, luego empújelos en una ubicación diferente. Sin embargo, esto tendrá el mismo problema que la extensión REBASE en términos de cambios basados en la combinación
- Intente usar la extensión TRANSPLANT para "copiar" los cambios de una ubicación a otra. Aún así, existe el mismo problema que con los dos primeros.
- Vuelva a hacer el trabajo, probablemente con la ayuda de una herramienta diferente para tomar los cambios realizados en los conjuntos de cambios que deseo descartar y volver a realizarlos en la ubicación correcta.
Para deshacerse del conjunto de cambios de combinación + todos los siguientes conjuntos de cambios, hay un par de opciones:
Usa el comando strip en la extensión MQ
hg strip <hash of merge changeset>
Clone y extraiga, y especifique el hash de los conjuntos de cambios anteriores, pero sin incluir la combinación. En esencia, cree un nuevo clon tirando del clon dañado a uno nuevo, y evite arrastrar la fusión que no desea.
hg clone damaged -r <hash of first parent> . hg pull damaged -r <hash of second parent>
Fusión empujada a otros, control sobre clones.
El programador ha presionado para dominar el repositorio, u otra persona, o alguien extraído del repositorio de programadores. Sin embargo, usted (como en el grupo de desarrolladores) tiene control sobre todos los repositorios, ya que, puede contactar y hablar con todos antes de que se haga más trabajo.
En este caso, vería si los pasos 1 o 2 se podrían realizar, pero podría tener que hacerse en muchos lugares, por lo que esto podría implicar mucho trabajo.
Si nadie ha realizado un trabajo basado en el conjunto de cambios de combinación, utilizaría los pasos 1 o 2 para limpiar, luego presionar al repositorio principal y pedirle a todos que obtengan un clon nuevo del repositorio principal.
Fusionado, no tienes control sobre los clones.
El programador presionó el mergeset, y usted no sabe quién tendrá el conjunto de cambios de combinación. En otras palabras, si logra erradicarlo de sus repositorios, un empujón extraviado de alguien que aún lo tenga lo devolverá.
Ignore el conjunto de cambios de combinación y trabaje en las dos ramas como si nunca hubiera ocurrido. Esto dejará una cabeza colgando. Luego puede, cuando haya fusionado las dos ramas, hacer una fusión nula para que esta cabeza se deshaga de ella.
M <-- this is the one you want to disregard
/ /
* *
| |
* *
| |
Simplemente continúe trabajando en las dos ramas:
| |
* *
| M | <-- this is the one you want to disregard
|/ /|
* *
| |
* *
| |
Luego, después de combinar los dos, la combinación real que desea:
m
/ /
* *
| |
* *
| M | <-- this is the one you want to disregard
|/ /|
* *
| |
* *
| |
A continuación, puede hacer una fusión nula para deshacerse de la cabeza colgando. Desafortunadamente, no sé cómo hacerlo, excepto a través de TortoiseHg. Tiene una casilla de verificación donde puedo descartar los cambios de una de las sucursales.
Con TortoiseHg, actualizaría a la combinación que quiero mantener (la m mayúscula más alta), luego selecciono y hago clic derecho en el encabezado de combinación colgante a continuación, y luego verifico "Descartar todos los cambios de la revisión del objetivo de combinación (otro)" :
Realmente no se puede retroceder una fusión muy bien. En mi opinión, la mejor manera de manejar esto sería simplemente abandonar la fusión y continuar la serie de conjuntos de cambios anteriores a la fusión, dejando una cabeza colgando (que se puede quitar). Si se han producido otros cambios desde la fusión, pueden volver a basarse en la nueva cabeza "buena".
Tuve este problema exacto Un compañero de trabajo accidentalmente fusionó mi rama con la rama predeterminada mientras aún estaba incompleta. Inicialmente, simplemente hice una copia de la combinación que parecía funcionar bien hasta que quise fusionar mi sucursal con el valor predeterminado para mantener. Los archivos que necesitaba estaban siendo marcados para su eliminación al fusionarlos.
La solución fue volver a mi copia original, que solucionó el error de mi compañero de trabajo y la de vuelta. Esto impidió que los archivos se marquen como eliminados y me permite unir con éxito mi rama a la predeterminada.
Esta respuesta asume que ya has empujado
Esto resultaría en (al menos una) cabeza sin resolver, dependiendo de lo que acaba de olvidar. Más dependiendo de quién acaba de empujar de qué rama.
Me encanta HG y lo uso con avidez, pero su idea de una rama puede volver loca a alguien cuando se combina con una historia que es (por diseño) intencionalmente inmutable.
Por lo general, clono una copia de seguridad (localmente) del repositorio antes de hacer una combinación de ramas, solo por esta razón. Siempre reviso antes de tirar.
Eric Raymond está trabajando en algo que es más o menos agnóstico de DVCS que puede (con suerte) ayudar en situaciones como las que usted describió, pero no creo que vaya a implementar el soporte de HG por una semana o dos. Sin embargo, podría valer la pena ver.
Pero, solo es útil si nadie ha sacado la punta ''ooopsie''.