git stash aplicar versión

513

Tengo 2 ramas: maestro | diseño

Trabajando en diseño hice un alijo y cambié a maestro, hice algunos ajustes. Volví al diseño e hice stash applysolo para perder todos mis cambios en la rama de diseño.

Espero que todo mi trabajo esté dentro de un alijo ya que no los he borrado o eliminado.

Si hago una lista oculta, obtengo 4 resultados:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

Si lo intento git stash apply f2c0c72obtengo un error:

fatal: Needed a single revision
f2c0c72: no valid stashed state found

¿Cómo puedo aplicar un alijo específico?

Sotavento
fuente
26
Tenga en cuenta que ahora tiene (Q4 2016, Git 2.11) la sintaxis git stash apply 0(en lugar de git stash apply stash@{0}). Mira mi respuesta aquí .
VonC

Respuestas:

839

Las claves en el alijo son en realidad los stash@{n}elementos de la izquierda. Entonces intenta:

git stash apply stash@{0}

(tenga en cuenta que en algunos shells debe citar "stash@{0}", como zsh, fish y powershell).

Desde la versión 2.11, es bastante fácil, puede usar el número de pila N en lugar de usar stash@{n}. Entonces, en lugar de usar:

git stash apply "stash@{n}"

Puedes escribir:

git stash apply n

Para obtener la lista de escondites:

git stash list

De hecho, stash@{0}es una revisión en git a la que puede cambiar ... pero git stash apply ...debería descubrir cómo DTRT para aplicarla a su ubicación actual.

araqnid
fuente
90
Solo una nota de que en algunos shells, se debe citar stash @ {n}.
Senjai
77
Otro consejo: puede hacer, por ejemplo, gitk stash@{0}para mostrar los cambios que realizó en un alijo en particular.
antinome
11
los usuarios de zsh necesitan comillas dobles, por ejemplogit stash apply "stash@{0}"
mynameistechno
77
stash@{n}es el comando más incómodo de escribir. ¿Hay atajos para hacer esto además de crear tu propio alias o función?
Dylanthepiguy
2
git stash apply nes pacífico
Victor
242

Para aplicar un alijo y eliminarlo de la lista de alijo, ejecute:

git stash pop stash@{n}

Para aplicar un alijo y mantenerlo en el caché del alijo, ejecute:

git stash apply stash@{n}
Dan Loewenherz
fuente
8
Esto es genial, gracias por distinguir entre las dos opciones. Acabo de probar esto y parece que si hace estallar un alijo de la rama-a en la rama-b, el alijo seguirá estando en el caché de alijo. Supongo que eso sería para que todavía tenga la opción de hacer estallar / aplicar el alijo a branch-a en una fecha futura. Realmente espero que tenga sentido. ¡Práctico!
Longda
42
Para PowerShell:git stash pop "stash@{n}"
ankitjaininfo
1
PowerShell está contento con llaves entre comillas / comillas simples:git stash apply stash@"{n}"
m1kael
PowerShell también aceptará git stash apply stash@`{n`}(tenga en cuenta los backticks antes de las llaves).
Ian Kemp
52

Desde la versión 2.11, es bastante fácil, puede usar el número de pila N en lugar de decir "stash@{n}". Entonces, en lugar de usar:

git stash apply "stash@{n}"

Puedes escribir:

git stash apply n

Por ejemplo, en tu lista:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

Si desea presentar stash@{1}una solicitud , puede escribir:

git stash apply 1

De lo contrario, puede usarlo incluso si tiene algunos cambios en su directorio desde 1.7.5.1, pero debe asegurarse de que el alijo no sobrescribirá los cambios de su directorio de trabajo si lo hace, obtendrá un error:

error: Your local changes to the following files would be overwritten by merge:
        file
Please commit your changes or stash them before you merge.

En versiones anteriores a 1.7.5.1, se negaba a funcionar si había un cambio en el directorio de trabajo.


Notas de lanzamiento de Git:

El usuario siempre tiene que decir "alijo @ {$ N}" al nombrar un solo elemento en la ubicación predeterminada del alijo, es decir, reflogs en refs / alijo. El comando "git stash" aprendió a aceptar "git stash apply 4" como una abreviatura de "git stash apply stash @ {4}"

git stash apply "solía negarse a trabajar si hubo algún cambio en el árbol de trabajo, incluso cuando el cambio no se superpuso con el cambio que registró el alijo

Pau
fuente
41

Si uno está en una máquina Windows y en PowerShell, necesita citar el argumento como:

git stash apply "stash@{0}"

... o para aplicar los cambios y eliminar del alijo:

git stash pop "stash@{0}"

De lo contrario, sin las comillas, puede obtener este error:

fatal: argumento ambiguo 'stash @': revisión desconocida o ruta que no está en el árbol de trabajo.

jterry
fuente
Aparentemente, así es como debe hacerlo cuando usa fish shell en Mac OSX 10.11 también.
lps
8
git stash list

luego seleccione el alijo para aplicar y use solo el número:

git stash apply 1
panthari
fuente
2
Git Stash list 

La lista mostrará todos los elementos escondidos, por ejemplo: stash @ {0} :, stash @ {1}:, .., stash @ {n}:

Luego seleccione el número n que denota alijo @ {n}:

git stash apply n 

for eg: git stash apply 1 will apply that particular stashed changes to the current branch
Harshavardhan reddy.
fuente