Estoy tratando de aplicar los cambios con los que me escondí anteriormente git stash pop
y recibo el mensaje:
Cannot apply to a dirty working tree, please stage your changes
¿Alguna sugerencia sobre cómo lidiar con eso?
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 show -p | git apply
diferente degit stash apply
?git stash apply
no aplicará los cambios escondidos si tiene una copia de trabajo sucia. Entonces puedes vergit 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:
y luego (opcionalmente):
fuente
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.
fuente
Limpie su directorio de trabajo con git reset, confirme los cambios o, si desea guardar los cambios actuales, intente:
Esto esconderá los cambios actuales y luego sacará el segundo alijo de la pila de alijo.
fuente
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).
fuente
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
fuente
También encontré que la solución de Mathias Leppich funcionaba muy bien, así que agregué un alias a mi .gitconfig global
Ahora solo puedo escribir
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).
fuente
Puede aplicar un alijo a un árbol "sucio" haciendo una
git add
etapa para cualquier cambio que haya realizado, limpiando así el árbol. Entonces puedesgit stash pop
y aplicar los cambios escondidos, no hay problema.fuente
Tiene archivos que han sido modificados pero no confirmados. Ya sea:
o, si desea guardar sus cambios:
fuente
Tuve el mismo problema pero git tenía cero archivos modificados. Resulta que tenía un archivo index.lock que estaba por ahí. Eliminarlo resolvió el problema.
fuente
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
yreset --hard
fallarán. Lo que finalmente funcionó fue guardar el alijo como una rama congit stash branch tempbranchname
, y luego hacer una fusión de rama normal:git checkout master
ygit merge tempbranchname
. De http://git-scm.com/book/en/Git-Tools-Stashing :fuente