¿Por qué Cherry-Pick me dice que he cambiado todas las líneas?

Actualizado

Considere el file abc, idéntico en ambos commits A y B

begin 123 456 789 klm end 

En A, refactorizamos la primera línea 123 => AAA y elegimos B en la parte superior del resultado. Git dice que all lines in the file have changed . Sin embargo, su diff funcionará normalmente si modificamos B actualizando una sola línea. Git se dará count de que solo esta línea de text ha cambiado en este caso, informando un conflicto de línea única si también fue la primera línea.

Aquí está el código para reproducir

 mkdir full-shit ; cd full-shit git init ; echo rrr > root ; git add root git commit -m root git checkout -b A ; git checkout -b B function makeABC { echo begin > abc echo " 123" >> abc echo " 456" >> abc echo " 789" >> abc echo " klm" >> abc echo end >> abc } echo commiting ABC into branch B makeABC ; git add abc ; git commit -m abc echo will make a new file for A instead of 'git cherry-pick B' git checkout A ; makeABC echo 'git checkout A ; git cherry-pick B' would work equally well to make copy A = B sed -i -e 's/123/AAA/g' abc git add abc ; git commit -m "A refactonetworking" echo observe that !!!PICKING B TELLS THAT ALL LINES BETWEEN A AND B ARE DIFFERENT!!! echo whereas if we picked C instead of B this would not happen -- git would make the diff operation properly, detectinc collision at the frist line of abc case "B" in "B") git cherry-pick B ;; "B2") git checkout B sed -i -e 's/123/BBB/g' abc git add abc ; git commit -m BBB git checkout A ; git cherry-pick B ;; esac git gui & echo 'full-shit' folder created 

Tenga en count que Git Gui marcó todas las líneas como conflictivas, mientras que los caracteres EOL coinciden totalmente en ambas confirmaciones porque fueron creadas en la misma ejecución, por el mismo código e incluso puede usar cherry-pick de B a A para evitar las operaciones del sistema de files dupdo.

Por esta razón, creo, este problema está más relacionado con el anterior , que con el EOL, que a menudo causa un resultado similar. Del mismo modo, en ese caso, git comienza a diferenciar líneas individuales si agrego el cambio B2 en la parte superior del primer compromiso en B. ¿Cuál es la lógica de git?

Esto sucede a veces si cambia el tipo de línea nueva (Windows newline vs Unix newline). git puede mostrar diff ignorando los cambios de espacio en blanco.

Cuando selecciona una confirmación en el browser de historial de git-gui , muestra qué cambió entre esa confirmación y su primer elemento primario, en este caso, el mismo resultado que git diff A^..A Como la twig A no tenía este file hasta su última confirmación, la diferencia muestra naturalmente todo el file como nuevo. B ni siquiera se considera en este punto.

Cuando se difieren las dos cabezas de bifurcación ( git diff A..B ) verá la diferencia directa entre A y B independientemente de las historias de los dos.

Se puede encontrar más información sobre la syntax utilizada para git diff en las revisiones de gitman .

En cuanto a la selección de cereza, se hace bien gracias a la fusión de tres vías .