2010-01-22 17 views

Respuesta

22

Un cambio que entra en conflicto es cuando dos personas han hecho un cambio en el mismo archivo de tal forma que los dos cambios no pueden resolverse automáticamente.

1) Comencemos con un ejemplo de una fusión no conflictiva.

archivo original

line1 
line2 
line3 

persona A cambia a esto:

line1CHANGED 
line2 
line3 

persona B cambia a esto:

line1 
line2CHANGED 
line3 

Cuando los son a la vez registró y se fusionaron , no hay conflicto porque puede resolver fácilmente producir este archivo final:

line1CHANGED 
line2CHANGED 
line3 

Subversion manejará esto automáticamente como una combinación.

2) Ahora un ejemplo de cambios contradictorios.

archivo original

line1 
line2 
line3 

persona A cambia a esto:

line1CHANGED_BY_A 
line2 
line3 

persona B cambia a esto:

line1CHANGED_BY_B 
line2 
line3 

Esto no se pueden combinar de forma automática, entonces es un conflicto Tendrá que resolver, ya sea aceptando el cambio de la persona A o el cambio de la persona B. En este caso, la subversión le avisará de conflictos y requerirá una decisión suya sobre cómo resolverlos.

3) Finalmente, puede tener cambios conflictivos y no conflictivos dentro de la misma revisión.

archivo original

line1 
line2 
line3 

persona A cambia a esto:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3 

persona B cambia a esto:

line1CHANGED_BY_B 
line2 
line3ALSO_CHANGED_BY_B 

Ahora, con este ejemplo, las dos personas han cambiado el archivo, y hay un cambio conflictivo en la línea 1 que debe resolverse, pero la línea s 2 & 3 son cambios no conflictivos y pueden resolverse automáticamente.

Puede elegir resolver esto de varias maneras.

En primer lugar, puede aceptar completamente el archivo A o B y descartar el otro. Esto daría lugar a que las otras personas se pierdan cambios no conflictivos. Por ejemplo, se elige para resolver por completo el uso de A, su archivo final sería:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3 

(Exactamente archivo de A, y todos los cambios de B se descartan)

En segundo lugar, puede resolver sólo los cambios conflictivos, y aún conserva todos los cambios no conflictivos.De esta forma elegirías el cambio de A o de B en la primera línea y obtendrás los cambios de ambas líneas de ambas personas. Por lo tanto, digamos por ejemplo que elija para resolver los conflictos utilizando A, su archivo final sería:

line1CHANGED_BY_A 
line2ALSO_CHANGED_BY_A 
line3ALSO_CHANGED_BY_B 

alternativa que puede utilizar herramientas como KDiff que apoyan la revisión de cada conflicto por separado (debido, por supuesto, usted puede tener cambios mutliple, tanto en conflicto como sin conflicto, dentro del mismo archivo), lo que le permitirá seleccionar diferentes métodos de resolución para cada uno.

Si tiene problemas para entender la fusión con las herramientas de línea de comando, le recomiendo que eche un vistazo a KDiff (u otra herramienta GUI merge/diff) ya que muestran los archivos uno al lado del otro (junto con el original) y te permite visualizar lo que haría cada acción de resolución.

+0

¡Gracias por tu respuesta detallada! ¡Pude reproducir tus ejemplos en un proyecto svn y finalmente entiendo la diferencia entre los comandos de conflicto de minas y los de minas completos! =) –

6

Considérese una función como esta (llámese revisión 1)

void foo(){ 
    int bar; 
} 

Ahora supongamos que dos personas hacen cambios a esta función, tanto a partir de la revisión 1.

Alice:

void foo(){ 
    char bar; 
} 

Bob:

double foo(){ 
    double bar; 
    bar = 0; 
    return bar; 
} 

Por el bien de este ejemplo, supongamos que Alice confirma sus cambios.

Ahora Bob va a enviar cambios, y svn le dirá a Bob que está desactualizado, y necesita actualizar y fusionar los cambios. Entonces Bob ejecuta una actualización y se produce la fusión.

Básicamente, es (algo) fácil ver que lo que sucede es un análisis que decide lo que Bob cambió de revisión 1 y lo que Alice cambió de revisión 1. Una combinación sencilla producirá algo así como

double foo(){ 
    [conflict] bar; 
    bar = 0; 
    return bar; 
} 

Nota que tanto Alice como Bob cambiaron el tipo de bar de int, excepto que Alice lo hizo char y Bob lo hizo double. La fusión no puede decidir cuál es la correcta (no está haciendo análisis de código), por lo que Bob necesita ayuda para resolver el conflicto.

El ejemplo es, por supuesto, algo inventado, y con la excepción del conflicto señalado, todos los demás cambios son no conflictos.

Si Bob no hubiera cambiado el tipo de bar, los archivos se hubieran fusionado sin conflicto.

+0

Buen ejemplo. +1 –

Cuestiones relacionadas