2011-03-11 9 views
6

Estaba experimentando con el formato de parche git para crear parches de un repositorio y aplicarlo a otro repositorio. Para mi sorpresa, funcionó a pesar de que esos dos archivos eran extremadamente diff. ¿Alguien puede explicar los aspectos técnicos de cómo exactamente maneja git la aplicación de un parche? Obviamente, no solo utiliza números de línea, así que si alguien puede señalarme en la dirección correcta, sería increíble.explicación técnica de Git/Diff Patch

+0

Puedes simplemente mirar el código. – Dipstick

+0

El código solo tiene rangos de número de línea con + y - líneas para eliminar y agregar. – David

Respuesta

8

Hay parches se pueden aplicar a los archivos modificados dos maneras principales:

  • juego sin modificar (“contexto”) y pre-modificación de líneas
  • de 3 vías de combinación basada en la línea “índice” de Git

las líneas de contexto (precedida por un solo espacio en lugar de una + o -) son una parte del formato unified diff sobre la cual formato diff de Git se basa en gran medida. Son líneas adicionales que son idénticas en los archivos fuente "original" y "modificado" pero que rodean las regiones modificadas. Estas líneas de contexto (junto con las líneas de pre-modificación (es decir, líneas eliminadas/cambiadas)) son utilizadas por el programa que aplica el diff para encontrar dónde se debe aplicar cada "hunk" de diferencias, incluso si el archivo "objetivo" de destino ya ha insertado o líneas eliminadas antes de la ubicación objetivo normal (la ubicación normal está especificada por los números de línea, que han cambiado efectivamente en el archivo "objetivo" (con respecto al archivo "original") debido a las líneas insertadas/eliminadas).

El formato de diferencias de Git también incluye una línea especial "índice" para cada archivo modificado que indica los identificadores de objeto (es decir, abreviaturas SHA-1 abreviadas) para los archivos "original" y "modificado". Si el repositorio de destino tiene el archivo "original" en su almacén de objetos, puede usarlo para reconstruir exactamente el contenido del archivo "modificado" y luego realizar un three-way merge entre las tres versiones del archivo: "original", "modificado" (ambos archivos fuente) y "objetivo" (el archivo de destino). Esto es usado por git am -3 y puede ayudar a resolver automáticamente algunos conflictos entre el parche y el archivo "objetivo".