¿Cuál es la diferencia entre 'git format-patch y' git diff '?

92

No veo una diferencia entre la salida de 'git format-patch' y 'git diff', ¿hay alguna? ¿Y no podré usar 'git diff' para producir un parche y luego aplicarlo usando git apply?

Mi problema es que tengo cambios agregados al índice, pero aparentemente git format-patch solo acepta confirmaciones, así que si puedo usar la salida de diff, entonces puedo usar este comando para producir un parche para los cambios en el índice:

git diff --cached > index.patch
Rafid
fuente

Respuestas:

129

Un parche creado con git format-patchtambién incluirá algo de metainformación sobre la confirmación (confirmador, fecha, mensaje de confirmación, ...) y contendrá diferencias de datos binarios. Todo se formateará como un correo, para que se pueda enviar fácilmente. La persona que lo reciba puede volver a crear la confirmación correspondiente git amy todos los metadatos estarán intactos. También se puede aplicar con git applyya que es un superconjunto de una diferencia simple.

Un parche empaquetado git diffserá una diferencia simple con contexto (piense diff -u). También se puede aplicar con git applypero los metadatos no se volverán a crear (ya que no están presentes).

En resumen, git format-patches útil para transmitir una confirmación, mientras que git diffes útil para obtener una diferencia entre dos árboles.

Sylvain Defresne
fuente
12

A partir de los manuales, git-format-patch prepara parches adecuados para el envío de correo electrónico, mientras que git-diff muestra los cambios.

Son dos cosas diferentes y tienen diferentes propósitos, simplemente dan como resultado un formato de parche. Pero git-format-patchagrega datos sobre una confirmación (fecha, autor, mensaje de confirmación) y la agrupa en un formato que es adecuado para enviar como un mensaje de correo Unix (aunque estos son solo archivos, por lo que se pueden enviar a otros métodos y seguir aplicando por git-am).

También git-format-patchgenera un archivo de parche para cada confirmación en el rango que especifique. Estos cambios se agregarán como confirmaciones a su repositorio con git-am.

git-diffsolo muestra la diferencia entre los dos estados que solicita y se puede usar para crear un archivo de parche. Pero este es solo un archivo de parche normal y la aplicación del parche solo cambiará el estado del directorio de trabajo.

Y sí, puede crear un parche para su índice de esa manera.

Abizern
fuente
Gracias. ¿Qué tiene de especial el correo UNIX para que hayan diseñado el parche basándose en él?
Rafid
7
No hay nada realmente especial. Esto es solo que git fue diseñado por Linus Torvalds, cuyo flujo de trabajo implicó enviar y recibir parches por correo electrónico para su validación antes de la integración en el kernel de Linux.
Sylvain Defresne
Git fue diseñado por Linus Torvalds para mantener el kernel de Linux. El correo Unix era un formato común.
Abizern
1

El archivo de parche se puede generar con el git diffcomando, pero en comparación con el parche generado por el git format-patchcomando, las principales diferencias son:

  1. No hay metadatos sobre una confirmación (como fecha, autor, mensaje de confirmación, etc.);
  2. No hay estadísticas sobre el diff (diffstat, como archivos x cambiados, inserciones y (+), eliminaciones z (-));
  3. Sin diferencias binarias, solo diferencias textuales.

ingrese la descripción de la imagen aquí

Para generar el archivo de parche para todos los archivos modificados (en el índice o en el directorio de trabajo):

git diff HEAD --binary > my.patch
# git diff + git diff --cached/staged == git diff HEAD

Para aplicar el archivo de parche generado:

# restore the changed files firstly
git restore --staged .
git restore .

# apply the patch to redo the changes 
git apply my.patch
# or
patch -p1 < my.patch
K. Símbolo
fuente