Conflicto de Git – Mostrando Falso Positivo

Me encuentro con un problema donde Git dirá que un file está en conflicto al intentar hacer una fusión, pero cuando voy a resolver el conflicto, no hay conflicto. ¿Por qué Git piensa que es un conflicto cuando lo local y lo remoto son lo mismo? ¿Hay alguna manera de que Git resuelva esto automáticamente?

Sistema operativo: Windows 8

Versión de Git: 1.9.5

Los files no son lo mismo.

Cuando GIT detecta que la misma línea / bloque se cambió en dos twigs fusionadas de una manera diferente, se genera un post de conflicto. Git no intenta resolver estos casos automáticamente, ya que resolverlos depende en gran medida de la semántica del contenido del file. Git no conoce XML, Java ni C #, no la syntax ASN1, y no intenta aprenderlos 🙂 Eso es lo más básico.

Sin embargo, algunos conflictos son "triviales" para usted como progtwigdor.

Es por eso que usualmente utilizas alguna herramienta de combinación externa como TortoiseMerge, WinMerge, KDiff3, etc. Estas contienen algunos algorithms / heurísticas diferentes, y son capaces de detectar / resolver automáticamente conflictos "triviales" comunes que a menudo se resuelven de la misma manera. manera, o incluso, que simplemente se ignoran como "sin importancia", por ejemplo:

  • conflictos de estilo de terminación de línea (CR vs CRLF vs LF ..)
  • Conflictos solo espacio en blanco ( 'class Foobar' vs 'class Foobar' vs ' class Foobar' )
  • conflictos de encoding (ASCII vs UTF8 vs UTF16)
  • conflictos al final del file (deberían tener una línea final adicional en EOF vs. no tenerlo)
  • etc.

Algunas de esas utilidades (especialmente las gráficas) pueden mostrarle que los files son "idénticos" porque su aparente contenido textual parece ser idéntico, incluso si los contenidos brutos de los files son diferentes. Esta es una cuestión de preference. Cuando se trabaja con files de código puros, generalmente no importa si su file Java o C # se guarda como UTF16 o UTF8; le interesan las diferencias de código . A menudo no le gustaría ver que cada línea se haya cambiado solo porque su colega la guardó con CRLF en lugar de LF.

Sin embargo, tres notas importantes:

  1. en tales casos, una buena fusión de files no le notificará que "los files son idénticos", sino que "los contenidos de los files son idénticos, pero los files no son binarys iguales"; KDiff3 hace eso, por ejemplo.
  2. Los espacios en blanco / lineeings / codificaciones / etc. pueden parecer poco importantes, pero no lo son. Tomemos por ejemplo Makefiles o Python. Hay una gran diferencia si hay un espacio o tres o una pestaña.
  3. por lo tanto, ignorar blancos / encoding / etc. depende estrictamente del uso del file. En la encoding C # puede no importar, en FooBar puede importar mucho. Es por eso que GIT no intenta imponer ningún manejo automático de tales colisiones. Git lo hace a salvo. La diferencia de file o fusión de files de su elección lo hizo por usted y lo "engañó" para que pensara que los files eran iguales.