Estoy haciendo algo muy simple mal. Estoy tratando de preparar un archivo de revisión normal, para poder volver a aplicar algunos cambios:
$ git diff > before
$ git diff something_here > save.patch
$ git checkout .
$ patch < save.patch
$ git diff > after
$ diff before after
$
Con el something_here
espacio en blanco casi funciona, pero los nombres de los archivos no son correctos. Creo que solo me falta alguna opción.
En la vida real, voy a hacer una fusión después del pago, por lo que el parche puede fallar allí, pero ya ves a lo que me refiero.
Edite
Mi culpa aquí por hacer la pregunta incorrecta. La pregunta real es, ¿quiero guardar mis cambios, hacer una fusión y luego volver a aplicar los cambios, si es posible? Lo pregunté de manera incorrecta porque estoy acostumbrado a usar parches para resolver este tipo de problemas y git diff
parecía que eso era lo que quería que hiciera.
El comentario de Charles Bailey tuvo la respuesta correcta. Para mí, git-apply es lo correcto (git-stash parece más pesado de lo que necesito y el rebase y los paquetes definitivamente están más allá de mi nivel de habilidad actual). Voy a aceptar la respuesta que Charles dio (porque usted No puedo aceptar un comentario). Gracias por todas las sugerencias.
Editar, 6 años después
Como sabe cualquier persona familiarizada con el tema, sobreestimé la dificultad de git stash
. Casi todos los días más o menos, usaré la siguiente secuencia:
$ git stash
$ git merge
$ git stash pop
patch
lugar degit apply
?git stash
otras herramientas de git?git stash
es la solución más fácil para lo que está tratando de hacer, pero hay muchos enfoques que funcionan.git-svn
.Respuestas:
Si desea usar el parche, debe eliminar los
a/
b/
prefijos que usa git de forma predeterminada. Puede hacerlo con la--no-prefix
opción (también puede hacerlo con la-p
opción de parche ):Por lo general, sin embargo, es más fácil usarlo directamente
git diff
y luego usar la salida para alimentarlogit apply
.La mayoría de las veces trato de evitar el uso de parches textuales. Por lo general, una o más confirmaciones temporales combinadas con rebase
git stash
y paquetes son más fáciles de administrar.Para su caso de uso, creo que
stash
es lo más apropiado.fuente
git diff --no-prefix master > diff.patch
y luegogit checkout master
patch -p0 < diff.patch
patch --dry-run < diff.patch
antes de emitir el último comando.patch
fuera de git (tal vez usando un archivo de parche generado pordiff
) en un caso de uso más general.Solo use
-p1
: de todos modos, deberá usar-p0
el--no-prefix
estuche, por lo que puede omitir--no-prefix
y usar-p1
:fuente
git diff
genera una línea quepatch
ignora.git apply
Es el camino a seguir.Los git diffs tienen un segmento de ruta adicional antepuesto a las rutas de archivo. Puede quitar esta entrada en la ruta especificando -p1 con parche, así:
fuente
save.patch
archivo a cualquier lugar (incluidos los archivos binarios).git apply <file>
fuente
git diff > save.patch
y engit checkout .
lugar de un reinicio, pero sí ...git apply
o haciendo que el diff sea relevante para su estado y el puntero a la última confirmación disponible. Hacer simplementegit diff
no ha hecho nada en absolutogit apply
. Lo que pasagit diff
es (creo) el usogit reset
: las relaciones entre el repositorio, el índice y el área de trabajo son el problema.Un truco útil para evitar crear archivos de parches temporales:
fuente
git stash show -p stash@{3} | patch -p1 -d [dst-dir]