2010-06-23 8 views
8

¿Es git la resolución de conflictos de fusión inherentemente más eficiente que otros SCM (CVS, Subversion, etc.), y también herramientas de fusión independientes? Si es así, ¿por qué?¿La resolución de conflictos de combinación de git es más eficiente que otros SCM y herramientas de fusión?

Aclaración: aquí Estoy más interesado en el algoritmo en sí, ¿es diferente de un método simple diff3?
Algunas herramientas afirman ser más inteligentes en eso (por ejemplo, Guiffy), ¿vale la pena usar una como herramienta de combinación git? ¿Es Git más inteligente para descifrar fragmentos de texto movidos dentro o entre archivos? (en lugar de informar conflictos ruidosos ... tuve una vaga impresión de eso en la charla de Linus).

Antecedentes: acaba de hacer una gran fusión usando git-svn que resultó en la mitad de los conflictos que obtuve con simple svn merge (primera fusión sin seguimiento) .. así que me gustaría entender por qué.


El son similares Qs/Como en todo, pero son más sobre el panorama general del proceso, y cómo encaja en la fusión que de forma más natural. A tal fin, se git 'optimizado para fusiones' (en oposición a solamente ramificación), significa en realidad:

  1. conflictos menos manuales - mejores algoritmos de auto-resolución (. Por ejemplo el cambio de nombre se maneja muy bien)
  2. una operación más segura - auto-resolución deja más únicos conflictos/real y menos falsas alertas
  3. más rápida operación - por ejemplo, debido a la magra & significa modelo de objetos
  4. mejor utillaje - lo que hace que la experiencia sea menos dolorosa, por ejemplo, seguimiento basado en la combinación de DAG, mergetool, consulta la historia/visualización, escondite, rebase, etc ...
  5. algo más
  6. una combinación de los anteriores

? Ahora, estoy más que interesado en 1 & 2.

+3

http://stackoverflow.com/questions/2475831/merging-hg-git-vs-svn o http: // stackoverflow.com/questions/2518779/what-are-the-benefits-of-mercurial-or-git-over-svn-for-branching-merging puede proporcionar algunas respuestas (sobre todo en comparación con SVN), y no olvide http://stackoverflow.com/questions/612580/how-does-git-solve-the-merging-problem – VonC

+0

Gracias, esos enlaces son realmente útiles, y no pude encontrarlos yo mismo. – inger

+0

@inger, ¿Entonces cierra la pregunta como duplicado? –

Respuesta

1

Me encantaría que se demuestre que estoy equivocado en esta respuesta pero ... viniendo de forzado ... esta área de git está un poco subdesarrollada.

  1. Combinación automática en git es inexistente. La última versión tiene soporte básico para realizar una combinación usando sus cambios o sus cambios, pero eso es todo. Básicamente, si editas una parte de un archivo y otra persona edita la misma parte de un archivo ... estás solo para la resolución de fusión. El formato diff3 está disponible (fusión de 3 vías) pero creo que el estándar es un formato unificado de diferencias. De hecho, uso araxis como la herramienta de fusión y lo tengo configurado para usar merge 3 vías cuando se ejecuta "git mergetool". Aunque vengo de forzado ... siento que Git está muy atrás en esta área.

  2. N/A

actualización RE: Comentarios

no he cavado lo suficientemente profundo en exactamente lo Git es un conflicto y es exactamente lo p4 piensa que es un conflicto, pero aquí es lo que he experimentado en ambos.

  • Git no ignora el espacio en blanco al hacer una fusión ... aunque se habla de esto en el futuro para git. p4 puede hacer esto ahora. No ignorar el espacio en blanco es un gran problema a menos que todos en el equipo acuerden usar espacios o pestañas y si desea cambiar la sangría de un archivo ... (por ejemplo, agregar un nodo xml alrededor de otros nodos) entonces esto se hace viejo rápido .
  • Siento que cuando encuentro conflictos de fusión en un archivo ... las partes que git dice están en conflicto usando su formato de diferencia unificada son más grandes. Cuando solo cambia una parte de una línea, marcará porciones más grandes según se modifiquen y deberá buscar visualmente los cambios entre las dos áreas de la salida de diff unificada. Sin embargo, puedes evitar esto usando una herramienta de mezcla. p4 puede resolver automáticamente conflictos incluso si edita la misma línea.
  • Si está fusionando ramas temáticas de larga vida, entonces se encontrará con un verdadero placer. Sin rerere activado (que está desactivado de forma predeterminada), git olvidará que ya fusionó ese archivo que estuvo en conflicto hace una semana y le pedirá que lo fusione de nuevo. p4 hace esto con facilidad

Mis respuestas aquí son un poco subjetivas ... pero echo mucho de menos la fusión que tuve con forzosamente.

+0

Solo para información, ¿qué hace forzosamente ahora si cambia la misma línea que otra persona ha cambiado en paralelo? La última vez que usé p4 fue marcado como un conflicto y necesitaba una resolución manual (similar a git). –

+0

+1 También tengo curiosidad sobre eso, ¿se ha inventado algo mejor que un diff de 3 vías? Parece haber variaciones en los algoritmos (consulte el documento técnico de Guiffy), pero si se cambia la misma línea, se quedará atascado en un conflicto manual ... a menos que, por supuesto, exista alguna herramienta de fusión basada en la inteligencia artificial y en la inteligencia artificial. – inger

+0

En mi humilde opinión "fusión automática inexistente" es poco fuerte. Está allí, en el sentido habitual: p. Ej. cuando usas KDiff3, tiene un botón 'Combinar automáticamente' y eso hace más o menos lo que hace GIT, a veces incluso mejor ... Pero me preguntaba si GIT debe/debería usar su información de historial adicional (por ejemplo, el orden de las confirmaciones) para tomar mejores decisiones? (como si supiera de dónde se pega el código, etc.) – inger

1

Además, este more recent thread (2012) detalla la noción de "auto-resolución" con Git:

Mi definición de "auto-determinación":
"Durante una combinación, los archivos del árbol de trabajo se actualizan a reflejar el resultado de la combinación ... Cuando ambas partes realizaron cambios en diferentes áreas del mismo archivo, git selecciona ambas partes automáticamente, y deja su decisión para asegurarse de que revise los resultados de la fusión para verificar que sean correctos después de que git haya realizado la fusionar commit ".

IOW, una "resolución automática" significa específicamente que ambos lados (el nuestro y el de ellos) hicieron cambios a file(a) ya que la versión de ancestro común de file(a), y git eligieron ambos lados sin provocar un conflicto de combinación.
(La razón por la que surgió el término "resolución automática" se debe a que en el resultado git-merge el término "Combinación automática" también puede indicar que solo un lado (el suyo) cambió file(a) ya que el antepasado común y ese git es . simplemente "avance rápido" de ellos file(a) en la parte superior de común ancestro file(a))

Junio C Hamano plantea como respuesta un punto importante:

  • saber Git es estúpida y yerra en el lado seguro, pateando cualquier cosa remotamente compleja;
  • saben que los conflictos textuales que ocurren en el mismo archivo tienen el mismo riesgo de tener conflictos semánticos en diferentes archivos, por lo que señalar "tocó el mismo archivo pero no entró en conflicto" es inútil, pero en cualquier caso, la posibilidad de tener un conflicto de este tipo es lo suficientemente pequeña como para completar la combinación (y otras fusiones) primero y luego verificar el resultado general, es un uso más eficiente de tu tiempo, porque tienes que mirar el resultado al menos una vez antes de sacarlo.
+0

Gracias. ¿Estás insinuando que la respuesta a mi pregunta es 'no'? – inger

+0

@inger: de hecho: "no por diseño" – VonC

Cuestiones relacionadas