untracked stash name files git git-stash

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

  1. crea un parche
  2. tuberías que al comando aplicar
  3. si hay algún conflicto, deberán resolverse mediante una combinación de 3 vías
  4. 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:

  1. git commit -a -m "Fixme"
  2. git stash pop
  3. git commit -a --amend
  4. 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 ...

  1. git commit -a -m "Fixme"
  2. git stash pop
  3. 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):

  1. git reflog --all uso de hash del escondite git reflog --all
  2. 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:

  1. Exportar stash @ {0} como un parche:

    git stash show -p stash @ {0}> Stash0.patch

  2. 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.