when - what is the command to delete a remote branch in git?
¿Cómo decide Git los conflictos? (4)
Como afirma Atropo en su respuesta ,
Git tiene un sistema de fusión interno que es independiente de
difftool
.
Por lo tanto, Git decide cuándo un cambio causa un conflicto por sí mismo, no mediante el uso de las herramientas externas de combinación o combinación que esté utilizando (que probablemente usen sus propias estrategias de resolución y detección de conflictos).
De acuerdo con la respuesta de VonC a ¿Qué constituye un conflicto de fusión en Git? (énfasis mío):
No creo que el algoritmo de combinación tenga algo especial con Git: es un algoritmo de combinación de tres vías clásico ( no el de Codeville ), que se puede usar asnwer (por defecto: recurse, o ó pulpo). El resultado es un proceso de fusión bastante simple que se describe aquí .
Cualquier necesidad de visualización se delega a herramientas de combinación / diferencia de terceros.
El artículo de Wikipedia al que se vincula explica una fusión de 3 vías por lo tanto (énfasis mío):
Una fusión de tres vías se realiza después de un análisis de diferencias automatizado entre un archivo ''A'' y un archivo ''B'' al mismo tiempo que se considera el origen, o ancestro común, de ambos archivos. Es un método aproximado de fusión, pero en realidad es ampliamente aplicable, ya que solo requiere un ancestro común para reconstruir los cambios que se fusionarán.
La combinación de tres vías utiliza el antecesor de los archivos modificados para identificar bloques de contenido que no han cambiado en ninguna, ni en una o ambas versiones derivadas. Los bloques que no han cambiado en ninguno de los dos quedan como están. Los bloques que han cambiado en un solo uso derivado de la versión modificada. Si se cambia un bloque en ambos derivados, la versión modificada se usa si tiene el mismo contenido en ambos lados, pero si los cambios difieren, se marca como una situación de conflicto y se deja para que el usuario lo resuelva .
La combinación de tres vías se implementa mediante el programa ubicuo diff3 , y fue la innovación central que permitió el cambio de sistemas de control de revisión basados en bloqueo de archivos a sistemas de control de revisión basados en fusión. Es ampliamente utilizado por el sistema de versiones concurrentes (CVS).
El artículo también habla sobre fusiones recursivas de tres vías , que veo que se usan mucho en Git:
El uso generalizado de las herramientas de control de revisión basadas en la fusión de tres vías ha planteado casos en los que la fusión simple de tres vías causa conflictos espurios y, a veces, vuelve a representar silenciosamente los cambios revertidos. Ejemplos de tales situaciones incluyen las combinaciones entrecruzadas y los conflictos de cambio de nombre de tres vías.
Los problemas de la fusión de tres vías surgen en situaciones en las que dos estados derivados no tienen un ancestro común más reciente y único (ACV). Para hacer frente a estos problemas, la combinación recursiva de tres vías construye un ancestro virtual al fusionar primero los ancestros no únicos. Esta técnica es utilizada por la herramienta de control de revisión Git .
La combinación recursiva de tres vías solo se puede utilizar en situaciones en las que la herramienta tenga conocimiento sobre la DAG (gráfica acíclica dirigida) de ascendencia total de los derivados que se fusionarán. Por consiguiente, no se puede utilizar en situaciones en las que los derivados o las combinaciones no especifiquen completamente su (s) padre (s).
Cuando salgo de GitHub cuando alguien más en el equipo modificó un archivo determinado, el comando Git muestra que hay conflictos no resueltos que Git no pudo solucionar. Abro Perforce o Visual Studio 2012 para solucionar los conflictos y las herramientas gráficas me muestran que no hay conflictos y realiza la fusión rápidamente.
¿Tiene Git una herramienta interna de detección / combinación de conflictos que sea independiente de su conjunto mergetool / difftool?
¿O utiliza sus herramientas configuradas para fusionar automáticamente y detectar conflictos sin resolver?
Mi situación es rara, Git muestra que no puede automatizarse, pero las herramientas gráficas no muestran problemas.
La publicación asnwer es la mejor respuesta que he visto en las estrategias de fusión de git. Y sí, puedes elegir cuál quieres con la -s option
Pero tu pregunta es por qué otras herramientas como Visual Studio lo combinan cuando git no puede. Visual Studio puede tener una estrategia de combinación bastante agresiva: "la función de fusión automática normalmente no usará ningún contenido de su versión anterior porque la configuración predeterminada de la función de combinación automática favorece al archivo más reciente", consulte here para obtener más información.
Para obtener más información sobre la herramienta de combinación que se incluye con VS 2012, vea esta publicación donde Brian Harry profundiza en cómo consideraron que "los conflictos mínimos al fusionarse" son una característica clave.
En cuanto a Perforce, sospecho que tienen una estrategia de fusión similar: el conector git a p4 debe estar utilizando las estrategias de fusión de la fuerza para descubrir y estoy seguro de que también son más agresivos.
"nuestro" podría ser una estrategia de fusión igualmente agresiva en git.
Pero lo que queda de largo es que cada producto está utilizando sus propias estrategias de fusión y algunos son más o menos agresivos. Depende de su caso de uso y las necesidades que sean aceptables.
Sí, una serie de IDE y herramientas de combinación realizarán resoluciones automatizadas de conflictos además de las de git.
Como se ve en git help merge-file
, el algoritmo de resolución de conflictos de stock de git para archivos de texto es bastante simple: los trozos difieren si cambian las líneas adyacentes. Si git no puede resolver automáticamente un conflicto de esta manera, pondrá un marcador de conflicto de texto en un formato que ha sido estándar desde los días de RCS, y que el IDE puede capturar y trabajar (incluso si no lo hace). saber sobre git):
<<<<<<<< Version identifier 1 Foo ======= Bar >>>>>>>> Version identifier 2
No uso Visual Studio, pero un rápido Google me dice que tiene una función de resolución de conflictos automática . (Yo uso kdiff3, que tiene su propio algoritmo de resolución de conflictos automático)
Git tiene un sistema de fusión interno que es independiente de difftool
. De todos modos, puede especificar la merge strategy
usando la opción -s
, del manual:
-s <strategy>
--strategy=<strategy>
Usa la estrategia de fusión dada; se puede suministrar más de una vez para especificarlos en el orden en que deben probarse. Si no hay opción -s, en su lugar se utiliza una lista integrada de estrategias (git merge-recursive cuando se fusiona una sola cabeza, git merge-octopus de lo contrario).
Las estrategias van desde el simple FastForward
al Octopus
cuando se fusionan muchos árboles. Verifique esta asnwer para ver cómo funcionan las diferentes estrategias de merge
.
De todos modos tu situación es rara. Tal vez su IDE está utilizando una estrategia de fusión diferente, por lo que cuando se abre, se fusiona de la manera correcta.