Tuve algunos cambios no comprometidos en mi rama de desarrollo y los escondí usando git stash, pero hubo algunos cambios que fueron muy importantes entre aquellos escondidos. ¿Hay alguna forma de recuperar esos cambios?
Además, he realizado algunos cambios en la parte superior de los archivos de código escondido desde entonces.
¿Hay alguna posibilidad de que pueda recuperar los cambios escondidos en una nueva rama si es posible?

Respuestas:
La respuesta fácil a la pregunta fácil es
git stash applySolo echa un vistazo a la rama en la que deseas que se realicen tus cambios y luego
git stash apply. Luego usegit diffpara ver el resultado.Una vez que está todo hecho con su cambios en la
applyapariencia buena y está seguro de que no es necesario el alijo cualquier más- entonces utilizargit stash droppara deshacerse de él.Siempre sugiero usar en
git stash applylugar degit stash pop. La diferencia es queapplydeja el alijo para volver a intentarlo fácilmenteapply, o para mirarlo, etc. Sipopes capaz de extraer el alijo, también lo hará inmediatamentedrop, y si de repente se da cuenta de que desea extraerlo en algún lugar de lo contrario (en una rama diferente), o con--index, o algo así, eso no es tan fácil. Si ustedapply, puede elegir cuándo hacerlodrop.Sin embargo, todo es bastante menor de una manera u otra, y para que un novato git, debería ser casi lo mismo. (¡Y puedes saltarte el resto de esto!)
¿Qué pasa si estás haciendo cosas más avanzadas o más complicadas?
Hay al menos tres o cuatro diferentes "formas de usar git stash", por así decirlo. Lo anterior es para el "camino 1", el "camino fácil":
Comenzó con una rama limpia, estaba trabajando en algunos cambios y luego se dio cuenta de que los estaba haciendo en la rama incorrecta. Solo desea tomar los cambios que tiene ahora y "moverlos" a otra rama.
Este es el caso fácil, descrito anteriormente. Ejecutar
git stash save(o simplegit stash, lo mismo). Echa un vistazo a la otra rama y úsalagit stash apply. Esto hace que git se fusione en tus cambios anteriores, utilizando el mecanismo de fusión bastante poderoso de git. Inspeccione los resultados cuidadosamente (congit diff) para ver si le gustan, y si lo hace, úselosgit stash droppara soltar el alijo. Ya terminaste!Comenzaste algunos cambios y los escondiste. Luego cambiaste a otra rama y comenzaste más cambios, olvidando que tenías los escondidos.
Ahora desea mantener, o incluso mover, estos cambios, y aplicar su alijo también.
De hecho
git stash save, puede de nuevo, ya quegit stashhace una "pila" de cambios. Si haces eso, tienes dos escondites, uno solo llamado,stashpero también puedes escribir,stash@{0}y otro escritostash@{1}. Usegit stash list(en cualquier momento) para verlos a todos. El más nuevo es siempre el más bajo. Cuando túgit stash drop, suelta el más nuevo, y el que sestash@{1}movió a la parte superior de la pila. Si tuvieras aún más, el que sestash@{2}convirtióstash@{1}, y así sucesivamente.Puede
applyy luegodropun alijo específico tambiéngit stash apply stash@{2}, y así sucesivamente. Al soltar un alijo específico, se vuelven a numerar solo los de mayor número. De nuevo, el que no tiene un número también lo esstash@{0}.Si acumula muchos alijos, puede volverse bastante desordenado (¿era el alijo que quería
stash@{7}o erastash@{4}? Espere, acabo de empujar otro, ¿ahora son 8 y 5?). Personalmente, prefiero transferir estos cambios a una nueva sucursal, porque las sucursales tienen nombres, ycleanup-attempt-in-Decemberpara mí significa mucho más que esostash@{12}. (Elgit stashcomando toma un mensaje de guardado opcional, y esos pueden ayudar, pero de alguna manera, todos mis escondites terminan nombradosWIP on branch).(Extra avanzado) Ha utilizado
git stash save -p, o hagit addinsertado cuidadosamente y / ogit rmeditado bits específicos de su código antes de ejecutarlogit stash save. Tenía una versión en el área oculta de índice / preparación y otra versión (diferente) en el árbol de trabajo. Quieres preservar todo esto. Así que ahora usagit stash apply --index, y eso a veces falla con:Estás utilizando
git stash save --keep-indexpara probar "lo que se comprometerá". Este está más allá del alcance de esta respuesta; vea esta otra respuesta de StackOverflow en su lugar.Para casos complicados, recomiendo comenzar primero en un directorio de trabajo "limpio", confirmando cualquier cambio que tenga ahora (en una nueva rama si lo desea). De esa manera, el "lugar" en el que los está aplicando, no tiene nada más, y solo intentará los cambios escondidos:
Ahora estás en un punto de partida "limpio". O tal vez se parece más a esto:
Lo más importante para recordar es que el "alijo" es una confirmación, es solo una confirmación un poco "divertida / extraña" que no está "en una rama". La
applyoperación analiza lo que cambió el commit e intenta repetirlo donde sea que esté ahora. El alijo todavía estará allí (loapplymantiene cerca), por lo que puede mirarlo más, o decidir que este era el lugar incorrectoapplye intentarlo de manera diferente, o lo que sea.Cada vez que tenga un alijo, puede usar
git stash show -ppara ver una versión simplificada de lo que está en el alijo. (Esta versión simplificada solo mira los cambios del "árbol de trabajo final", no los cambios guardados en el índice que se--indexrestauran por separado). El comandogit stash apply, sin--index, solo intenta hacer esos mismos cambios en su directorio de trabajo ahora.Esto es cierto incluso si ya tiene algunos cambios. El
applycomando se complace en aplicar un alijo a un directorio de trabajo modificado (o al menos, tratar de aplicarlo). Puedes, por ejemplo, hacer esto:Puede elegir el orden de "solicitud" aquí, seleccionando las reservas particulares para aplicar en una secuencia particular. Sin embargo, tenga en cuenta que cada vez que básicamente realiza una "fusión de git", y como lo advierte la documentación de fusión:
Si comienza con un directorio limpio y solo está haciendo varias
git applyoperaciones, es fácil retroceder: usegit reset --hardpara volver al estado limpio y cambiar susapplyoperaciones. (Por eso recomiendo comenzar primero en un directorio de trabajo limpio, para estos casos complicados).¿Qué pasa con el peor de los casos posibles?
Digamos que estás haciendo un montón de cosas avanzadas de Git, y has hecho un alijo, y quieres hacerlo
git stash apply --index, pero ya no es posible aplicar el alijo guardado--index, porque la rama ha divergido demasiado desde el momento en que lo guardaste.Esto es para lo que
git stash branchsirve.Si tu:
stash, luegogit stash apply --indexel intento de volver a crear los cambios definitivamente va a trabajar. Esto es lo que hace. (Y luego deja caer el alijo ya que se aplicó con éxito).
git stash branch newbranchAlgunas palabras finales sobre
--index(¿qué diablos es eso?)Lo que
--indexhace es simple de explicar, pero un poco complicado internamente:git add(o "ponerlos en escena") antes decommiting.git stash, es posible que haya editado ambos archivosfooyzorg, pero solo haya organizado uno de ellos.git addlasaddcosas ed y nogit addlas cosas no agregadas. Es decir, siaddeditófoopero nozorgregresó antes de hacerlostash, podría ser bueno tener exactamente la misma configuración. Lo que fue escenificado, nuevamente debe ser escenificado; lo que se modificó pero no se organizó, nuevamente se debe modificar pero no se organizó.La
--indexbandera deapplyintenta configurar las cosas de esta manera. Si su árbol de trabajo está limpio, esto generalmente funciona. Sin embargo, si su árbol de trabajo ya tiene materialaddeditado, puede ver cómo puede haber algunos problemas aquí. Si se excluye--index, laapplyoperación no intenta preservar toda la configuración preparada / no preparada. En cambio, solo invoca la maquinaria de fusión de git, usando el commit del árbol de trabajo en la "bolsa de escondite" . Si no le importa conservar las etapas o no, dejar de lado--indexhace que sea mucho más fácilgit stash applyhacer lo suyo.fuente
git stash pop? ¿O quieres decir: has editado algunos archivos, pero aún no hasgit stashvuelto a ejecutarlos ? ¿O quieres decir algo completamente diferente?applyun alijo. No tiene que hacer esto, pero hace que las cosas sean mucho más simples de ver. Puede usarrebase -ipara aplastar múltiples confirmaciones, o seleccionar cambios particulares, o lo que sea, más adelante.git stash apply --index(recuerda los dos guiones). Si lo dejas afuera--index, no es gran cosa; el único punto--indexes mantener la configuración por etapas / por etapas. (Probablemente no tenía ninguna configuración especial en primer lugar). Luegogit status, etc., y agregue / confirme como desee, etc. Cuando (y solo cuando) haya terminado con el alijo, úselogit stash droppara descartarlo.dropopop) el alijo, siempre se tiene la seguridad de código escondido original en una confirmación, porque un alijo es una confirmación! Si desea recuperarlo exactamente, pero en una rama, úselogit stash branch(consulte la sección anterior o el libro Pro Git en la respuesta de Shunya ). Entonces puedegit checkoutesa rama, ogit cherry-pickel compromiso de esa rama, etc.pondrá todo de nuevo en su lugar
como se sugiere en los comentarios, puede usar
git stash branch newbranchpara aplicar el alijo a una nueva rama, que es lo mismo que ejecutar:fuente
git stash branch newbranchhecho lo hará; pero tenga en cuenta que crea la nueva rama con su conjunto primario en el commit que estabaHEADen el momento en questashse realizó. En otras palabras, es para cuando regrese después de una larga sesión de pirateo o lo que sea, mire el desastre y decida "Debería haberlo puesto en una rama, en lugar de esconderlo" :-)Para simplificar esto, tiene dos opciones para volver a aplicar su alijo:
git stash pop- Restaurar de nuevo al estado guardado, pero elimina el alijo del almacenamiento temporal.git stash apply- Restaura de nuevo al estado guardado y deja la lista oculta para una posible reutilización posterior.Puede leer con más detalle sobre las reservas de git en este artículo.
fuente
Para verificar el contenido de tu alijo: -
aplicar un alijo particular no de la lista de alijo: -
o para aplicar solo el primer alijo: -
Nota: git stash pop eliminará el alijo de su lista de escondite, mientras que git stash no se aplicará. Así que úsalos en consecuencia.
fuente
En mac esto funcionó para mí:
lista de alijo git (ver todos tus alijos)
se aplica git stash (solo el número que desea de su lista de alijo)
Me gusta esto:
fuente
puede guardar los cambios no confirmados usando "git stash" y luego pasar a una nueva rama usando "git checkout -b" y luego aplicar los commits escondidos "git stash apply"
fuente