Respuestas:
Cuando tengo que aplicar cambios escondidos a una copia de trabajo sucia, por ejemplo, extraer más de un conjunto de cambios del alijo, utilizo lo siguiente:
$ git stash show -p | git apply -3 && git stash drop
Básicamente
Me pregunto por qué no hay una -f
opción (forzada) para la git stash pop
cual debería comportarse exactamente como la línea anterior.
Mientras tanto, es posible que desee agregar esta línea como un alias git:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Gracias a @SamHasler por señalar el -3
parámetro que permite resolver conflictos directamente a través de la fusión de 3 vías.
git stash apply
no aplicará los cambios escondidos si tiene una copia de trabajo sucia. Entonces puedes ver git stash show -p | git apply
como se aplica algún tipo de escondite forzado.
error: <file> does not match index
cada archivo modificado. Sin embargo, otra solución funcionó.
Lo hago de esta manera:
git add -A
git stash apply
y luego (opcionalmente):
git reset
git add -u
, que es como, -A
excepto que no agrega archivos sin seguimiento.
Puede hacerlo sin tener que guardar sus cambios actuales exportando el alijo que desea como un archivo de parche y aplicándolo manualmente.
Por ejemplo, supongamos que desea aplicar stash @ {0} a un árbol sucio:
Exportar alijo @ {0} como parche:
git stash show -p stash @ {0}> Stash0.patch
Aplicar manualmente los cambios:
git apply Stash0.patch
Si el segundo paso falla, tendrá que editar el archivo Stash0.patch para corregir cualquier error y luego intentar git apply nuevamente.
Limpie su directorio de trabajo con git reset, confirme los cambios o, si desea guardar los cambios actuales, intente:
$ git stash save "descripción de los cambios actuales" $ git stash pop stash @ {1}
Esto esconderá los cambios actuales y luego sacará el segundo alijo de la pila de alijo.
La solución de Mathias es definitivamente la más cercana a un git stash pop --force (y realmente, vamos desarrolladores de Git, ¡obtengamos esta opción ya!)
Sin embargo, si desea hacer lo mismo utilizando solo comandos git, puede:
En otras palabras, haga una confirmación (que nunca empujaremos) de sus cambios actuales. Ahora que su espacio de trabajo está limpio, saque su alijo. Ahora, confirme los cambios de alijo como una enmienda a su confirmación anterior. Una vez hecho esto, ahora tiene ambos conjuntos de cambios combinados en una sola confirmación ("Fixme"); simplemente restablezca (--soft NO --duro para que no se pierda nada) su pago a "uno antes de esa confirmación", y ahora tiene ambos conjuntos de cambios, completamente no comprometidos.
** EDITAR * *
Me acabo de dar cuenta de que en realidad es aún más fácil; puedes omitir por completo el paso 3, así que ...
(Confirme los cambios actuales, elimine los cambios escondidos, restablezca ese primer compromiso para obtener ambos conjuntos de cambios combinados en un estado no confirmado).
Ninguna de estas respuestas realmente funciona si te encuentras en esta situación como lo hice hoy. Independientemente de cuántos git reset --hard
hice, no me llevó a ninguna parte. Mi respuesta (no oficial de ninguna manera fue):
git reflog --all
También encontré que la solución de Mathias Leppich funcionaba muy bien, así que agregué un alias a mi .gitconfig global
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Ahora solo puedo escribir
git apply-stash-to-dirty-working-tree
que funciona muy bien para mi
(Su millaje puede variar en este largo nombre de alias. Pero me gusta una dosis de verbosidad cuando se trata de completar bash).
Puede aplicar un alijo a un árbol "sucio" haciendo una git add
etapa para cualquier cambio que haya realizado, limpiando así el árbol. Entonces puedes git stash pop
y aplicar los cambios escondidos, no hay problema.
Tiene archivos que han sido modificados pero no confirmados. Ya sea:
git reset --hard HEAD (to bring everything back to HEAD)
o, si desea guardar sus cambios:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
No pude conseguir que la mayoría de estos funcionen; Por alguna razón, siempre piensa que tengo cambios locales en un archivo. No puedo aplicar un alijo, los parches no se aplicarán checkout
y reset --hard
fallarán. Lo que finalmente funcionó fue guardar el alijo como una rama con git stash branch tempbranchname
, y luego hacer una fusión de rama normal: git checkout master
y git merge tempbranchname
. De http://git-scm.com/book/en/Git-Tools-Stashing :
Si desea una forma más fácil de probar los cambios guardados nuevamente, puede ejecutar git stash branch, que crea una nueva rama para usted, verifica el compromiso en el que estaba cuando escondió su trabajo, vuelve a aplicar su trabajo allí y luego deja caer el esconderse si se aplica con éxito
git stash show -p | git apply
diferente degit stash apply
?