Cree un parche de git a partir de los cambios no confirmados en el directorio de trabajo actual

Resuelto vrish88 asked hace 13 años • 8 respuestas

Digamos que tengo cambios no confirmados en mi directorio de trabajo. ¿Cómo puedo hacer un parche a partir de ellos sin tener que crear un compromiso?

vrish88 avatar Mar 02 '11 02:03 vrish88
Aceptado

Si aún no ha confirmado los cambios, entonces:

git diff > mypatch.patch

Pero a veces sucede que parte de las cosas que estás haciendo son archivos nuevos que no tienen seguimiento y no estarán en tu git diffsalida. Entonces, una forma de hacer un parche es preparar todo para una nueva confirmación ( git addcada archivo, o solo git add .), pero no realizar la confirmación, y luego:

git diff --cached > mypatch.patch

Agregue la opción 'binario' si desea agregar archivos binarios al parche (por ejemplo, archivos mp3):

git diff --cached --binary > mypatch.patch

Posteriormente podrás aplicar el parche:

git apply mypatch.patch
jcarballo avatar Mar 15 '2013 17:03 jcarballo

git diffpara cambios no escalonados.

git diff --cachedpara cambios escalonados.

git diff HEADtanto para cambios escalonados como no escalonados.

sigjuice avatar Mar 01 '2011 19:03 sigjuice

git diffy git applyfuncionará para archivos de texto, pero no para archivos binarios.

Puedes crear fácilmente un parche binario completo, pero tendrás que crear una confirmación temporal. Una vez que haya realizado sus confirmaciones temporales, puede crear el parche con:

git format-patch <options...>

Después de haber realizado el parche, ejecute este comando:

git reset --mixed <SHA of commit *before* your working-changes commit(s)>

Esto revertirá sus confirmaciones temporales. El resultado final deja su copia de trabajo (intencionalmente) sucia con los mismos cambios que tenía originalmente.

En el lado receptor, puedes usar el mismo truco para aplicar los cambios a la copia de trabajo, sin tener el historial de confirmaciones. Simplemente aplique los parches y git reset --mixed <SHA of commit *before* the patches>.

Tenga en cuenta que es posible que deba estar bien sincronizado para que toda esta opción funcione. He visto algunos errores al aplicar parches cuando la persona que los hizo no había realizado tantos cambios como yo. Probablemente haya formas de hacerlo funcionar, pero no lo he investigado mucho.


A continuación se explica cómo crear los mismos parches en Tortoise Git (no es que recomiende usar esa herramienta):

  1. Confirme sus cambios de trabajo
  2. Haga clic derecho en el directorio raíz de la rama y haga clic en Tortoise Git->Create Patch Serial
    1. Elija el rango que tenga sentido ( Since: FETCH_HEADfuncionará si está bien sincronizado)
    2. Crear los parches
  3. Haga clic derecho en el directorio raíz de la rama y haga clic en Tortise Git->Show Log
  4. Haga clic derecho en la confirmación antes de su(s) confirmación(es) temporal(es) y haga clic enreset "<branch>" to this...
  5. Seleccione la Mixedopción

Y cómo aplicarlos:

  1. Haga clic derecho en el directorio raíz de la rama y haga clic en Tortoise Git->Apply Patch Serial
  2. Seleccione los parches correctos y aplíquelos
  3. Haga clic derecho en el directorio raíz de la rama y haga clic en Tortise Git->Show Log
  4. Haga clic derecho en la confirmación antes de las confirmaciones del parche y haga clic enreset "<branch>" to this...
  5. Seleccione la Mixedopción
Merlyn Morgan-Graham avatar Mar 25 '2012 22:03 Merlyn Morgan-Graham

Para crear un parche con archivos nuevos y modificados (preparados), puede ejecutar:

git diff HEAD > file_name.patch
Ionel Sirbu avatar Oct 13 '2015 09:10 Ionel Sirbu

Me gusta:

git format-patch HEAD~<N>

donde <N>está el número de últimas confirmaciones para guardar como parches.

Los detalles sobre cómo utilizar el comando se encuentran en el DOC.

UPD Explicación de la solución cuando se llama a GIT_PREFIX desde el directorio Git de nivel superior

UPD
Aquí podrás encontrar cómo aplicarlos a continuación.

UPD Para aquellos que no entendieron la idea de format-patch
Agregar alias:

git config --global alias.make-patch '!bash -c "cd ${GIT_PREFIX:-.};git add .;git commit -m ''uncommited''; git format-patch HEAD~1; git reset HEAD~1"'

Luego, en cualquier directorio del repositorio de su proyecto, ejecute:

git make-patch

Este comando se creará 0001-uncommited.patchen su directorio actual. El parche contendrá todos los cambios y archivos sin seguimiento que son visibles para el siguiente comando:

git status .
Eugen Konkov avatar Sep 13 '2018 13:09 Eugen Konkov