name - git stash untracked files
Git stash: "No se puede aplicar a un árbol de trabajo sucio, por favor, escenifique sus cambios" (11)
Estoy tratando de aplicar los cambios que escondí antes con git stash pop
y obtengo 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 ocultos a una copia de trabajo sucia, por ejemplo, mostrar más de un conjunto de cambios del alijo, utilizo lo siguiente:
$ git stash show -p | git apply -3 && git stash drop
Básicamente
- crea un parche
- tuberías que al comando aplicar
- si hay algún conflicto, deberán resolverse mediante una combinación de 3 vías
- si apply (o merge) tuvo éxito, se descarta el elemento stash recién aplicado ...
Me pregunto por qué no hay una opción -f
(force) para git stash pop
que se comporte exactamente como el one-liner anterior.
Mientras tanto, es posible que desee agregar este one-liner como git alias:
$ 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 parámetro -3
que permite resolver conflictos directamente a través de la fusión de 3 vías.
La solución de Mathias es definitivamente la más cercana a un git stash pop --force (y realmente, vamos desarrolladores de Git, ¡ya tenemos esta opción!)
Sin embargo, si desea hacer lo mismo utilizando solo comandos git, puede:
- git commit -a -m "Fixme"
- git stash pop
- git commit -a --amend
- git reset CABEZA ~
En otras palabras, realice una confirmación (que nunca haremos) de sus cambios actuales. Ahora que tu espacio de trabajo está limpio, abre tu escondite. Ahora, confirma los cambios de ocultación como una enmienda a tu compromiso anterior. Una vez hecho esto, ahora tiene ambos conjuntos de cambios combinados en una única confirmación ("Fixme"); simplemente resetee (--soft NOT - hard para que no se pierda nada realmente) su checkout a "uno antes de esa confirmación", y ahora tiene ambos conjuntos de cambios, completamente sin confirmar.
** EDITAR * *
Me di cuenta de que en realidad es aún más fácil; puede saltear completamente el paso 3, entonces ...
- git commit -a -m "Fixme"
- git stash pop
- git reset CABEZA ~
(Confirme los cambios actuales, extraiga los cambios ocultos, restablezca el primer compromiso para obtener ambos conjuntos de cambios combinados en un estado no comprometido).
Lo hago de esta manera:
git add -A
git stash apply
y luego (opcionalmente):
git reset
Ninguna de estas respuestas realmente funciona si te encuentras en esta situación como lo hice hoy. Independientemente de la cantidad de git reset --hard
''s que hice, no me llevó a ninguna parte. Mi respuesta (no oficial de ninguna manera fue):
-
git reflog --all
uso de hash del esconditegit reflog --all
- Combina ese hash con la rama que te interesa
No pude hacer funcionar la mayoría de estos; por alguna razón, siempre cree que tengo cambios locales en un archivo. No puedo aplicar un alijo, los parches no se aplicarán, el checkout
y el reset --hard
no se reset --hard
. Lo que finalmente funcionó fue guardar el escondite como una rama con git stash branch tempbranchname
, y luego hacer una fusión de rama normal: git checkout master
y git merge tempbranchname
. Desde http://git-scm.com/book/en/Git-Tools-Stashing :
Si desea una manera más fácil de probar los cambios ocultos de nuevo, puede ejecutar la rama git stash, que crea una nueva rama para usted, verifica la confirmación que estaba realizando cuando guardó su trabajo, vuelve a aplicar su trabajo allí y luego descarta el trabajo. esconder si se aplica con éxito
Puede hacerlo sin tener que esconder sus cambios actuales exportando el alijo que desea como archivo de parche y aplicándolo manualmente.
Por ejemplo, supongamos que quieres aplicar stash @ {0} a un árbol sucio:
Exportar stash @ {0} como un parche:
git stash show -p stash @ {0}> Stash0.patch
Aplicar manualmente los cambios:
git apply Stash0.patch
Si el segundo paso falla, deberá editar el archivo Stash0.patch para corregir cualquier error y luego intentar volver a aplicar git.
Puedes aplicar un alijo a un árbol "sucio" haciendo un git add
para organizar cualquier cambio que hayas hecho, limpiando así el árbol. Entonces puedes hacer git stash pop
y aplicar los cambios escondidos, no hay problema.
También encontré que la solución de Mathias Leppich funcionaba muy bien, así que agregué un alias para mi global .gitconfig
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Ahora puedo simplemente escribir
git apply-stash-to-dirty-working-tree
que funciona bien para mi
(Su millaje puede variar en este nombre largo de alias. Pero me gusta una dosis de verbosidad cuando se trata de completar bash).
Tienes archivos que se han modificado pero no se han confirmado. 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
Tuve el mismo problema pero git no tuvo ningún archivo cambiado. Resulta que tenía un archivo index.lock que estaba por ahí. Eliminarlo resolvió el problema.
Ya sea que limpie su directorio de trabajo con git reset, confirme los cambios o, si quiere esconder los cambios actuales, intente:
$ git stash save "description of current changes" $ git stash pop stash@{1}
Esto esconderá los cambios actuales y luego insertará el segundo alijo de la pila de alijo.