Imagínese este escenario:Mercurial, conflicto, fusión, conflictos posteriores más adelante, ¿Mercurial recuerda la resolución inicial?
- Alice y Bob ambos clones un master repositorio central mercurial, que contiene 1 archivo de texto
- Tanto Alice y Bob realiza un cambio en la misma línea en el archivo, y se compromete
- Bob empuja de nuevo al depósito central, pero no Alice
- Alice ahora se detiene en su repositorio, avisos que ahora tiene dos cabezas, y se funde
- Dado que la fusión se produce un conflicto, se resuelve el conflicto
- Alice luego confirma pero no empuja
- Bob ahora realiza más cambios en el archivo, en alguna otra ubicación del archivo (es decir. en ninguna parte cerca de los cambios iniciales) y confirma, y empuja
- Alicia, en su archivo fusionado, hace un cambio similar en la misma ubicación que Bob acaba de cambiar, y confirma
- Alicia tira, y descubre otro repositorio de doble cabeza, se fusiona
Aquí es una visión diferente de la situación anterior
(los números después de "CAMBIO" significa que la persona ha cambiado "porción X" del archivo. Si los usuarios cambian la misma porción, tenemos un conflicto de fusión por delante, si cambiaron diferente, no tanto)
Alice Bob CLONE MASTER CLONE MASTER ----------------------------------------- CHANGE 1 <-----+ COMMIT +-- upcoming merge conflict ----------------------------------------- | CHANGE 1 <-----+ COMMIT PUSH ----------------------------------------- PULL <-- Bob's change +1 head MERGE <-- Attempt to get rid of extra head RESOLVE CONFLICT <-- Resolve merge conflict COMMIT ----------------------------------------- CHANGE 2 <-----+ COMMIT +-- yet another merge PUSH | conflict ahead ----------------------------------------- | CHANGE 2 <-----+ COMMIT PULL <-- Bob's change, again +1 head MERGE <-- Attempt to get rid of extra head RESOLVE ???
En este punto, mi pregunta es la siguiente:
- ¿Las herramientas para fusionar llevarla primera resolución de combinación en cuenta? Como Bob nunca hizo los cambios de Alice, su copia sigue sin tener en cuenta los cambios que Alice hizo, su cambio inicial (que estaba en conflicto con Bob), su fusión y su último cambio, que está en conflicto con el último cambio de Bob. .
Si simplemente hubiera tomado la versión de Bob del archivo, y la versión de Alice del archivo, y dado a cualquier programa de fusión, marcaría ambos cambios como en conflicto.
En otras palabras, ¿la herramienta de conflicto intentará pedirle a Alice que resuelva tanto el conflicto original como el nuevo, o solo el último?
Supongo (
No he intentado esto, todavía intento construir algún tipo de script de prueba para probar este problema
) que Mercurial solo le pedirá a Alice que resuelva el último conflicto.
¿Qué sucede si configuro Mercurial para utilizar un programa de difusión/combinación de terceros? ¿Esto todavía se aplicará? Por ejemplo, he configurado mi instalación para usar Beyond Compare, ¿los dos archivos (Bob con solo sus cambios y los de Alice con sus cambios + la resolución de fusión) se darán con o sin la resolución inicial presente? En otras palabras, si usa Beyond Compare, ocurrirá lo correcto aquí (suponiendo que lo haga)
Bien, entonces el escenario no representará ningún problema, ¿no será cada vez más difícil fusionar los cambios en archivos "ocupados"? –
@Lasse V. Karlsen en absoluto. – msarchet
Sí, es un flujo de trabajo bastante normal. Lo ideal es que Bob mejore haciendo su parte de tirar y fusionar, pero cuando bob es un proyecto externo, no siempre es posible. Funciona genial. –