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 apply
Solo echa un vistazo a la rama en la que deseas que se realicen tus cambios y luego
git stash apply
. Luego usegit diff
para ver el resultado.Una vez que está todo hecho con su cambios en la
apply
apariencia buena y está seguro de que no es necesario el alijo cualquier más- entonces utilizargit stash drop
para deshacerse de él.Siempre sugiero usar en
git stash apply
lugar degit stash pop
. La diferencia es queapply
deja el alijo para volver a intentarlo fácilmenteapply
, o para mirarlo, etc. Sipop
es 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 drop
para 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 stash
hace una "pila" de cambios. Si haces eso, tienes dos escondites, uno solo llamado,stash
pero 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
apply
y luegodrop
un 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-December
para mí significa mucho más que esostash@{12}
. (Elgit stash
comando 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 add
insertado cuidadosamente y / ogit rm
editado 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-index
para 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
apply
operación analiza lo que cambió el commit e intenta repetirlo donde sea que esté ahora. El alijo todavía estará allí (loapply
mantiene cerca), por lo que puede mirarlo más, o decidir que este era el lugar incorrectoapply
e intentarlo de manera diferente, o lo que sea.Cada vez que tenga un alijo, puede usar
git stash show -p
para 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--index
restauran 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
apply
comando 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 apply
operaciones, es fácil retroceder: usegit reset --hard
para volver al estado limpio y cambiar susapply
operaciones. (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 branch
sirve.Si tu:
stash
, luegogit stash apply --index
el 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 newbranch
Algunas palabras finales sobre
--index
(¿qué diablos es eso?)Lo que
--index
hace es simple de explicar, pero un poco complicado internamente:git add
(o "ponerlos en escena") antes decommit
ing.git stash
, es posible que haya editado ambos archivosfoo
yzorg
, pero solo haya organizado uno de ellos.git add
lasadd
cosas ed y nogit add
las cosas no agregadas. Es decir, siadd
editófoo
pero nozorg
regresó 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
--index
bandera deapply
intenta 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 materialadd
editado, puede ver cómo puede haber algunos problemas aquí. Si se excluye--index
, laapply
operació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--index
hace que sea mucho más fácilgit stash apply
hacer lo suyo.fuente
git stash pop
? ¿O quieres decir: has editado algunos archivos, pero aún no hasgit stash
vuelto a ejecutarlos ? ¿O quieres decir algo completamente diferente?apply
un alijo. No tiene que hacer esto, pero hace que las cosas sean mucho más simples de ver. Puede usarrebase -i
para 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--index
es 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 drop
para descartarlo.drop
opop
) 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 checkout
esa rama, ogit cherry-pick
el compromiso de esa rama, etc.pondrá todo de nuevo en su lugar
como se sugiere en los comentarios, puede usar
git stash branch newbranch
para aplicar el alijo a una nueva rama, que es lo mismo que ejecutar:fuente
git stash branch newbranch
hecho lo hará; pero tenga en cuenta que crea la nueva rama con su conjunto primario en el commit que estabaHEAD
en el momento en questash
se 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