git format-patchTambién incluye diferencias binarias y alguna metainformación. En realidad, esa sería la mejor apuesta para crear un parche, pero afaik esto solo funciona para fuentes / cambios verificados, ¿verdad?
Eric
20
A veces puede ser útil crear un parche relativo al directorio actual. Para lograr esto, usegit diff --relative
ejboy
30
git diff> a.patch para escribirlo en un archivo
qasimzee
139
En pocas palabras, sarcástico, la respuesta a continuación es más útil.
Aire
1865
Si aún no ha confirmado los cambios, entonces:
git diff > mypatch.patch
Pero a veces sucede que parte de las cosas que está haciendo son archivos nuevos que no se rastrean y no estarán en su git diffsalida. Entonces, una forma de hacer un parche es organizar todo para una nueva confirmación ( git addcada archivo, o simplemente git add .) pero no hacer 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
Luego puede aplicar el parche:
git apply mypatch.patch
Nota: También puede usar --stagedcomo sinónimo de --cached.
Muchas gracias por el ejemplo. A diferencia de la respuesta aceptada, muestra a los comandos cómo hacerlo y no solo habla. Muy útil y funcionó a la perfección para mí :)
nuala
44
Hice exactamente eso y obtuve "fatal: entrada no reconocida" al ejecutar git apply. ¿Alguna idea de qué puede causar esto y cómo solucionarlo?
Vitaly
66
@Vitaly: ¿tu parche es legible si lo abres con un editor de texto? debe estar limpio sin caracteres extraños, por ejemplo, si la configuración de color.diff está configurada, su parche tendrá algunos 'caracteres de color' que pueden hacer que 'git apply' falle, en ese caso, intente git diff --no-color. De lo contrario, parece un problema de codificación.
jcarballo
3
Relacionado con "nuevos archivos sin seguimiento": "git diff" y "git diff --cached" solo funcionan si se ha llamado primero a "git add <file>". (Soy nuevo en Git y me pregunto por qué siempre tengo un parche vacío)
Anónimo
55
Esto me sacó de un extraño infierno de fusión / rebase bastante fácilmente, gracias :)
John Hunt
86
git diffy git applyfuncionará para archivos de texto, pero no funcionará para archivos binarios.
Puede crear fácilmente un parche binario completo, pero tendrá 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á su (s) confirmación (es) temporal (es). El resultado final deja su copia de trabajo (intencionalmente) sucia con los mismos cambios que tuvo originalmente.
En el lado receptor, puede usar el mismo truco para aplicar los cambios a la copia de trabajo, sin tener el historial de confirmación. Simplemente aplique los parches y git reset --mixed <SHA of commit *before* the patches>.
Tenga en cuenta que es posible que tenga que estar bien sincronizado para que 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 hay maneras de hacer que funcione, pero no lo he investigado demasiado.
Aquí se explica cómo crear los mismos parches en Tortoise Git (no es que recomiendo usar esa herramienta):
Compromete tus cambios de trabajo
Haga clic derecho en el directorio raíz de la rama y haga clic en Tortoise Git->Create Patch Serial
Elija el rango que tenga sentido ( Since: FETCH_HEADfuncionará si está bien sincronizado)
Crea el parche
Haga clic derecho en el directorio raíz de la rama y haga clic en Tortise Git->Show Log
Haga clic derecho en la confirmación antes de su (s) confirmación (es) temporal (es) y haga clic enreset "<branch>" to this...
Seleccione la Mixedopcion
Y cómo aplicarlos:
Haga clic derecho en el directorio raíz de la rama y haga clic en Tortoise Git->Apply Patch Serial
Seleccione los parches correctos y aplíquelos
Haga clic derecho en el directorio raíz de la rama y haga clic en Tortise Git->Show Log
Haga clic derecho en el commit antes del commit (s) del parche y haga clic enreset "<branch>" to this...
Luego, en cualquier directorio de su repositorio de proyectos, ejecute:
git make-patch
Este comando creará 0001-uncommited.patchen su directorio actual. El parche contendrá todos los cambios y archivos no rastreados que son visibles para el siguiente comando:
También podríamos especificar los archivos, para incluir solo los archivos con cambios relativos, particularmente cuando abarcan múltiples directorios ex
Descubrí que esto no se especifica en las respuestas o comentarios, que son todos relevantes y correctos, así que decidí agregarlo. ¡Explícito es mejor que implícito!
Respuestas:
git diff
para cambios no organizados.git diff --cached
para cambios por etapas.fuente
git format-patch
También incluye diferencias binarias y alguna metainformación. En realidad, esa sería la mejor apuesta para crear un parche, pero afaik esto solo funciona para fuentes / cambios verificados, ¿verdad?git diff --relative
Si aún no ha confirmado los cambios, entonces:
Pero a veces sucede que parte de las cosas que está haciendo son archivos nuevos que no se rastrean y no estarán en su
git diff
salida. Entonces, una forma de hacer un parche es organizar todo para una nueva confirmación (git add
cada archivo, o simplementegit add .
) pero no hacer la confirmación, y luego:Agregue la opción 'binario' si desea agregar archivos binarios al parche (por ejemplo, archivos mp3):
Luego puede aplicar el parche:
Nota: También puede usar
--staged
como sinónimo de--cached
.fuente
git diff --no-color
. De lo contrario, parece un problema de codificación.git diff
ygit apply
funcionará para archivos de texto, pero no funcionará para archivos binarios.Puede crear fácilmente un parche binario completo, pero tendrá que crear una confirmación temporal. Una vez que haya realizado sus confirmaciones temporales, puede crear el parche con:
Después de haber realizado el parche, ejecute este comando:
Esto revertirá su (s) confirmación (es) temporal (es). El resultado final deja su copia de trabajo (intencionalmente) sucia con los mismos cambios que tuvo originalmente.
En el lado receptor, puede usar el mismo truco para aplicar los cambios a la copia de trabajo, sin tener el historial de confirmación. Simplemente aplique los parches y
git reset --mixed <SHA of commit *before* the patches>
.Tenga en cuenta que es posible que tenga que estar bien sincronizado para que 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 hay maneras de hacer que funcione, pero no lo he investigado demasiado.
Aquí se explica cómo crear los mismos parches en Tortoise Git (no es que recomiendo usar esa herramienta):
Tortoise Git
->Create Patch Serial
Since
:FETCH_HEAD
funcionará si está bien sincronizado)Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opcionY cómo aplicarlos:
Tortoise Git
->Apply Patch Serial
Tortise Git
->Show Log
reset "<branch>" to this...
Mixed
opcionfuente
Para crear un parche con archivos modificados y nuevos (por etapas), puede ejecutar:
fuente
git diff --cached > mypatch.patch
no funciona.file_name.patch
ser utilizada por elpatch
comando? ¿Son compatibles entre sí?Me gusta:
donde
<N>
es el número de últimas confirmaciones para guardar como parches.Los detalles sobre cómo usar el comando están en el DOC
UPD
Aquí puede encontrar cómo aplicarlos luego.
UPD Para aquellos que no tuvieron la idea de
format-patch
Agregar alias:
Luego, en cualquier directorio de su repositorio de proyectos, ejecute:
Este comando creará
0001-uncommited.patch
en su directorio actual. El parche contendrá todos los cambios y archivos no rastreados que son visibles para el siguiente comando:fuente
Si quieres hacer binarios, da una
--binary
opción cuando corrasgit diff
.fuente
También podríamos especificar los archivos, para incluir solo los archivos con cambios relativos, particularmente cuando abarcan múltiples directorios ex
Descubrí que esto no se especifica en las respuestas o comentarios, que son todos relevantes y correctos, así que decidí agregarlo. ¡Explícito es mejor que implícito!
fuente