¿Cómo eliminar un alijo creado con git stash create?

549

Git stash parece hacer mucho de lo que quiero, excepto que es un poco difícil de escribir, ya que si no tiene cambios, git stash; git stash pophará algo diferente que si tiene cambios en su repositorio.

Parece que esa git stash createes la respuesta a ese problema, y ​​todo funciona, excepto por una cosa ... No puedo deshacerme del alijo creado. ¿Hay alguna forma de deshacerse del alijo?

Para que quede 100% claro lo que estoy haciendo:

Crea el alijo:

~/tmp/a(master) $ git stash create 
60629375d0eb12348f9d31933dd348ad0f038435
~/tmp/a(master) $ git st
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#
~/tmp/a(master) $ git reset --hard
HEAD is now at 555d572 log message

Usa el alijo:

~/tmp/a(master) $ git apply 60629375d0eb12348f9d31933dd348ad0f038435
fatal: can't open patch '60629375d0eb12348f9d31933dd348ad0f038435': No such file or directory
~/tmp/a(master) $ git stash apply 60629375d0eb12348f9d31933dd348ad0f038435
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#

Eliminar el alijo: (excepto que este último bit no funciona)

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference
Paul Wagland
fuente
A pesar de la distancia en el tiempo, quiero señalar a los compañeros de viaje que la git applyejecución en el segundo cuadro de código en el momento de escribir esto no aplicó un parche; el mensaje de error en la salida le dijo esto. Entonces, de hecho, trataste de crear un alijo (que no funcionó, mira los comentarios a continuación) aplica un alijo que no se creó y luego dejaste un alijo que no se creó. Por eso nada de lo que hiciste funcionó.
Profesor Tom
1
@ProfessorTom se creó el alijo, es por eso que devolvió un código hash y por qué git stash applyfuncionó. Los git applyintentos de leer un archivo de parche local, que no existe. Para ser sincero, probablemente no debería estar allí, y nunca podría haber funcionado. Estoy vagamente tentado a eliminarlo de la pregunta, pero dado que ha ayudado a tantos en su forma actual, lo dejaré como está.
Paul Wagland

Respuestas:

369

Para eliminar un alijo normal creado con git stash, desea git stash dropo git stash drop stash@{n}. Ver abajo para más detalles.


No es necesario eliminar un alijo creado con git stash create. De los documentos:

Cree una entrada oculta (que es un objeto de confirmación regular) y devuelva su nombre de objeto, sin almacenarlo en ningún lugar del espacio de nombres de referencia. Esto está destinado a ser útil para los scripts. Probablemente no sea el comando que desea usar; ver "guardar" arriba.

Como nada hace referencia a la confirmación de almacenamiento, eventualmente se recolectará basura.


Un alijo creado con git stasho git stash savese guarda en refs/stash, y se puede eliminar con git stash drop. Al igual que con todos los objetos Git, el contenido real de alijo no se elimina de su computadora hasta que se eliminen gcesos objetos después de que caduquen (el valor predeterminado es 2 semanas después).

Las reservas más antiguas se guardan en el refs/stash registro de registro (prueba cat .git/logs/refs/stash) y se pueden eliminar con git stash drop stash@{n}, donde nse muestra el número git stash list.

dahlbyk
fuente
20
No responde la pregunta titular. Como resultado, las personas como yo, que llegan a la pregunta a través de Google en busca de la respuesta a la pregunta titular y no se preocupan particularmente por los detalles reales, votan a la persona que realmente la respondió. Algunas personas también rechazan la respuesta aceptada porque no les ayuda. Personalmente acabo de votar la respuesta que me ayudó.
ArtOfWarfare
15
Entonces: 1) Google "git delete stash" 2) haga clic en el enlace SO basado en la primera mitad del título de la pregunta 3) rechace la respuesta correcta específica a la segunda mitad del título. Esa es una nueva.
dahlbyk
10
@ArtOfWarfare Eso sería una falta de comprensión de lectura, porque esta es claramente una respuesta a la "pregunta titular".
Chris Hayes
1
Lo suficientemente justo. Creo mis escondites usando solo git stash: no sé si eso realmente se asigna a git stash createalgo más. Git es ciertamente algo que todavía estoy aprendiendo sobre (si no lo fuera, no estaría leyendo SO Q & A de esta manera.)
ArtOfWarfare
1
@AdrianPronk Este es exactamente el tipo de cosas que recomendaría usar en realidad git stash create. En lugar de guardar en un archivo de parche con marca de tiempo, puede dejar que el registro de git lo guarde en una referencia personalizada (por ejemplo refs/backup). Intentaría algo como 1) git stash create, 2) comparar el nuevo árbol de alijo con refs/backup^{tree}, 3) si el árbol es diferente git update-ref --create-reflog refs/backup <stash-sha>,. Eventualmente, las reservas de respaldo antiguas se podarán automáticamente.
dahlbyk
838

git stash dropno toma ningún parámetro, que deja caer el alijo superior, o una referencia de alijo que se parece a: stash@{n}que ndesigna qué alijo para dejar caer. No puede pasar una identificación de confirmación a git stash drop.

git stash drop            # drop top hash, stash@{0}
git stash drop stash@{n}  # drop specific stash - see git stash list

Dejar caer un escondite cambiará las stash@{n}designaciones de todos los escondites más abajo en la pila.

No estoy seguro de por qué crees que necesitas dejar un alijo porque si estás usando stash createuna entrada de alijo no se crea para tu "alijo", entonces no hay nada que tirar.

CB Bailey
fuente
Bueno, la entrada se crea usando "alijo" ... Uno lógicamente pensaría que se eliminaría usando "alijo".
Paul Wagland
2
Mire la página de manual de git stash. stash create no crea una entrada, solo el objeto de confirmación para el alijo, por lo que no hay ninguna entrada en el registro de alijo para eliminar.
CB Bailey
3
Desde man : create Cree un alijo (que es un objeto de confirmación regular) y devuelva su nombre de objeto, sin almacenarlo en ningún lugar del espacio de nombres de referencia.
ruffin
41
Precaución : Probablemente no debería soltar múltiples como 1, 2, 3, ya que en realidad terminará soltando lo que originalmente eran los números 1, 3 y 5. La forma correcta de soltar 1, 2 y 3 sería hágalos en el orden 3, 2, 1 o 1, 1, 1. Además, está indexado 0, con 0 en la parte superior de la pila.
ArtOfWarfare
2
Git Extensions emite un comando desconocido cuando se presiona el botón "Stash Changes", y todo lo que hace persiste al salir y reiniciar la aplicación. No hay una forma obvia de deshacerse del alijo utilizando la GUI, pero desde la línea de comando "git stash list" muestra el alijo WIP, y "git stash clear" se deshace de él.
Dave
215

Si está 100% seguro de tener solo un alijo o si desea eliminar todos los alijos (asegúrese de git stash listque esté 107% seguro), puede hacer lo siguiente:

git stash clear

..y olvídate de ellos (elimina todos los escondites).

Nota: Se agregó esta respuesta para aquellos que terminaron aquí buscando una forma de eliminarlos a todos (como yo).

Felipe Pereira
fuente
26
Si solo tiene un alijo, aún recomendaría usarlo git stash drop, ya que eso solo deja caer un alijo, y no tiene que preocuparse por perder más de lo esperado.
Paul Wagland
Votado como realmente responde a la pregunta, si es o no la mejor práctica hacerlo. De hecho, necesito esto, ya que los escondites que he creado hoy deben desaparecer.
Alex McCabe
2
He estado usando alijo por mucho tiempo ahora. Esta vez, sin embargo, no pude deshacerme del último alijo que hice simplemente usándolo git stash dropcomo siempre. No estoy seguro de lo que hice de manera diferente. De todos modos, git stash clearfuncionó para mí. No sabía que existía. +1
Konstantinos Gaitanis
3
+1 porque git se negaba a dejar el alijo, ya que uno de los archivos creados por el alijo ya existía ahora ..
Thiago Barcala
12
específicamente, 107% seguro.
levininja
84

Desde git doc: http://git-scm.com/docs/git-stash

soltar [-q | --quiet] []

Elimine un solo estado oculto de la lista de ocultación. Cuando no se da, elimina la última. es decir stash@{0}, de lo contrario debe ser una referencia de registro de alijo válida del formulario alijo @ {}.

ejemplo:

git stash drop stash@{5}

Esto eliminaría la entrada de alijo 5. Para ver toda la lista de alijos:

git stash list
Jorge
fuente
44
Excepto que explícitamente digo al final de la pregunta que git stash drop no hace lo que quiero.
Paul Wagland
1
Recomendaría verificar el contenido de un alijo usando - git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}antes de ejecutar git stash drop. Créeme, te ahorrará muchos problemas :)
realPK
71

Deberías estar usando

git stash save

y no

git stash create

porque esto crea un alijo (que es un objeto de confirmación regular) y devuelve su nombre de objeto, sin almacenarlo en ningún lugar del espacio de nombres de referencia. Por lo tanto, no será accesible con stash apply.

El uso git stash save "some comment"se usa cuando tiene cambios no escalonados que desea replicar / mover a otra rama

Use git stash apply stash@{0}(suponiendo que su índice de alijo guardado sea 0) cuando desee que sus cambios guardados (escondidos) se reflejen en su rama actual

siempre puedes usar git stash listpara verificar todos tus índices

y use git stash drop stash@{0}(suponiendo que su índice de alijo guardado sea 0 y desee eliminarlo) para eliminar un alijo en particular.

Shalom Sam
fuente
3
Solo para información - Simplemente escribiendo el comando por git stashdefectogit stash save
RBT
1
git stash createestá destinado a ser utilizado por scripts. Ese es el caso de uso de OP. Por lo tanto, recomendar git stash savepuede ser útil para usos "normales", pero no para el caso de uso de OP. OP puede querer echar un vistazo a los documentos : hay más comandos relacionados con las secuencias de comandos, por ejemplogit stash store
Adrian W
1
git stash save "message"hoy en día debería leer git stash push -m "message". Comparargit commit -m "message"
Tino
2

Tambien funciona

git stash drop <index>

me gusta

git stash drop 5
MonTea
fuente
1

El documento está aquí (en chino) , haga clic.

puedes usar

lista de alijo git

git stash drop stash @ {0}

ingrese la descripción de la imagen aquí

Longalei
fuente
git stash createes diferente a git stash save, en particular, el formulario de creación no aparece en la lista y no se puede descartar, de ahí la pregunta.
Paul Wagland
@PaulWagland Agradece tu respuesta y proporciona la respuesta. Honestamente, no encuentro el "git stash create" en el documento oficial. Pero sobre esto, me interesa. Si desea encontrar el "git stash create" en la "lista de git stash". Puedes hacer esto arriba.
Longalei
0
git stash           // create stash,
git stash push -m "message" // create stash with msg,
git stash apply         // to apply stash,
git stash apply indexno // to apply  specific stash, 
git stash list          //list stash,
git stash drop indexno      //to delete stash,
git stash pop indexno,
stash pop = stash drop + stash apply
git stash clear         //clear all your local stashed code
Bilal Yaqoob
fuente