¿Cómo puedo formatear el parche con lo que guardo?

140

En git, guardo mis cambios. ¿Es posible que pueda crear un parche con lo que guardo? ¿Y luego aplicar ese parche en otro repositorio (el de mi compañero de trabajo)?

Lo sé git format-patch -1 , pero creo que es por lo que me he comprometido. Pero estoy buscando lo mismo para los cambios que guardé.

¿Y cómo puedo aplicar un parche en otro repositorio?

Silverburgh
fuente

Respuestas:

155

Claro, git stash showesto es compatible:

git stash show -p

Entonces, usa

git stash list

para averiguar el número de alijo que desea exportar como parche, luego

git stash show -p stash@{<number>} > <name>.patch

para exportarlo

Por ejemplo:

git stash show -p stash@{3} > third_stash.patch
Greg Hewgill
fuente
1
Tengo una pregunta relacionada sobre aplicar un parche. Digamos que mi parche toca varios archivos. ¿Hay alguna manera de aplicar el parche 'interactivamente'? ¿A qué archivos del parche debo aplicar el parche? ¿Puedo hacer eso?
silverburgh
1
@silverburgh: eché un vistazo rápido man patchy no vi ninguna opción para la aplicación de parches interactivos. Sin embargo, dado que los archivos de parche son archivos de texto sin formato, generalmente lo que se haría sería editar el parche en un editor de texto para recortar las partes relevantes para aplicar patch. Alternativamente, si está aplicando el parche en otro repositorio de Git, puede aplicarlo todo y luego seleccionar selectivamente los git checkoutarchivos que no desea cambiar ( git checkoutcon un nombre de archivo desecha los cambios no organizados).
Greg Hewgill
1
@silverburgh puede restringir el conjunto de archivos parcheados usando los parámetros "--exclude" e "--include" de git apply.
Kelvin
@silverburgh puede hacer lo siguiente suponiendo que tiene un parche. aplique el parche completamente y luego hágalo git add --interactive ${YOUR_FILES}y le dará la oportunidad de comprometerse parcialmente.
Alex
15
Gracias. Esto funcionó para mí:git stash show -p stash@{1} > patch.txt
Ryan
63

Esta respuesta proporciona información sobre cómo guardar el parche y aplicarlo donde desea usarlo.

Para esconder la salida en un archivo:

 git stash show -p --color=never > my-patch-name.patch

Verifique que el parche se vea bien:

git apply --stat my-patch-name.patch

Verificar sin errores:

git apply --check my-patch-name.patch

Aplique el parche

git apply my-patch-name.patch
becerro
fuente
Este me funcionó con archivos de código de texto sin formato, pero tuve que tener en cuenta el espacio en blanco. Verifique que el parche se vea bien: git apply --check --ignore-space-change --ignore-whitespace my-patch-name.patch aplique el parche: git apply --ignore-space-change --ignore-whitespace my-patch-name.patch
Craig Boland
Agradable y concisa explicación. Para que funcione, tuve que estar en la raíz del repositorio al aplicar el parche, de lo contrario git applyno recogí el diff.
Max
16

Utilizar

$> git stash list
stash@{0}: WIP on master: 84fx31c Merged with change to /public/
stash@{1}: WIP on master: 463yf85 FlupResource: also takes json as a query parameter

para obtener una lista de tus cosas escondidas recientemente. Git en realidad crea objetos de confirmación cuando se esconde.

Son commits como todo lo demás. Puedes verlos en una rama:

$> git checkout -b with_stash stash@{0}

Luego puede publicar esta rama y su colega puede fusionar o seleccionar ese compromiso.

peritus
fuente
13

Las soluciones anteriores no funcionarán para datos binarios. Lo siguiente agrega soporte para ello:

git stash show stash@{0} -p --binary

Editar

Nota: Solo quería agregar un comentario a las respuestas anteriores, pero mi reputación no es suficiente.

Davide Guerri
fuente
3

Creo que este podría ser uno de los udpates de Git recientemente. ya no tienes que remendar los cambios que guardaste. simplemente puede aplicar sus cambios escondidos en una rama a otra.

digamos que en la rama A escondió algunos cambios, conocidos como stash @ {1}.

ahora cambia a la rama B. simplemente puede hacer:

$git stash apply stash@{1}

esto aplica tus cambios de rama A a rama B.

Stucash
fuente