Git merge comportándose loco

He estado usando Git durante los últimos dos años y su fusión ha sido una de las mayores fusiones que he utilizado hasta ahora, pero últimamente solo me está comportando mal. Nada ha cambiado en mi git, pero cada vez que hago una fusión solo está actuando.

Por ejemplo: empecé a ver cosas como

<<<<<<< CABEZA

también – >>>>>>> Cambios controlados

y

<<<<<<< Actualizado stream arriba

Eso es lo que veo dentro de mi código después de que termine la fusión automática. Por extraño que parezca, no me ha pedido que resuelva los conflictos de forma manual como solía hacerlo antes. Nunca antes había hecho eso. ¿Alguien ha visto este comportamiento antes?

Esto suena muy parecido a un problema de espacio en blanco. Dos posibilidades (y probablemente ambas, según su descripción):

Espacios en blanco al final de las líneas

Muchos editores de text sangrarán tu código automáticamente por ti. Esto significa que, si deja líneas en blanco en el medio de las funciones, pueden contener espacios o tabs.

Por ejemplo, imagine el siguiente código:

  function somethingFunky() { setupFunkyProcess(); prepareTheFunk(); goFunky(); } 

Si activamos la vista de códigos especiales (o como lo llame su editor), podemos ver:

 » function somethingFunky() {¶ » » setupFunkyProcess();¶ » » prepareTheFunk();¶ » » ¶ » » goFunky();¶ » }¶ 

O podemos ver:

 » function somethingFunky() {¶ » » setupFunkyProcess();¶ » » prepareTheFunk();¶ ¶ » » goFunky();¶ » }¶ 

¿Ves la diferencia en la línea en blanco? Para la mayoría de los lenguajes de progtwigción, no hace absolutamente ninguna diferencia. Si sigue siendo así, también hace cero diferencia para Git.

Pero imagine, durante una edición futura, que cambia de una forma a la otra. Tal vez elimine manualmente el espacio en blanco, o tal vez cambie a un editor de text que elimina el espacio en blanco cuando lo guarda. Ahora habrá una diferencia técnica entre las dos versiones, pero es solo espacio en blanco; la diferencia se verá así:

 <<<<<<< HEAD ======= >>>>>>> BranchToMergeFrom 

¿Parecer familiar? Con códigos especiales activados, en realidad es:

 <<<<<<< HEAD¶ » » ¶ =======¶ ¶ >>>>>>> BranchToMergeFrom¶ 

Caracteres de final de línea

La otra posibilidad, que explicaría la advertencia en tu comentario:

 warning: LF will be replaced by CRLF 

es un cambio de caracteres de final de línea.

Cuando guarda un file de text, se usa un código especial para indicar el final de cada línea. Desafortunadamente, los diferentes sistemas operativos no están de acuerdo con el código que se debe usar. Hay mucha información en Wikipedia ( http://en.wikipedia.org/wiki/Newline ) pero todo lo que necesita saber es una PC con Windows y un sistema Mac o Linux usará un código EOL diferente.

Si dos desarrolladores están queueborando, pero utilizan diferentes sistemas operativos, los diferentes códigos EOL causarán muchos conflictos a less que acepten un estándar común.

La manera en que los usuarios de Git suelen hacerlo es acordar que todas las confirmaciones utilizarán el código EOL de Linux (Git fue creado originalmente para ayudar al desarrollo del kernel de Linux). Git se puede configurar para convertir automáticamente las terminaciones de línea cuando se confirma. Hay algunas buenas instrucciones en Github: https://help.github.com/articles/dealing-with-line-endings .

¿Qué sucede si usted (u otro desarrollador) no configura su sistema para administrarlo correctamente? Los files serán técnicamente diferentes, pero como solo son espacios en blanco, los posts de diferencias pueden no ser tan útiles:

 <<<<<<< WindowsEOL This is my test file. The contents are irrelevant; they are simply here for the purpose of EOL comparison. In this file, the line endings are Windows format. In other words, CRLF ======= This is my test file. The contents are irrelevant; they are simply here for the purpose of EOL comparison. In this file, the line endings are Unix format. In other words, LF >>>>>>> UnixEOL 

¿Qué puedes hacer para resolver esto?

Suponiendo que algunos de estos cambios en el espacio en blanco ya se hayan comprometido con su repository, no hay mucho que pueda hacer aparte de estar al tanto de lo que está sucediendo en futuras ediciones.

Si este es su repository, defina algunos estándares (EOL de Windows o Linux, quite el espacio en blanco o no) y comuníquelo a sus queueboradores. Si está contribuyendo con el repository de otra persona, intente descubrir cuáles son sus estándares y apéguese a ellos usted mismo.

Dependiendo de la extensión del problema (número de files, número de discrepancias, etc.) es posible que desee realizar una limpieza del repository y confirmar sin más cambios.