Git stash: "No se puede aplicar a un árbol de trabajo sucio, por favor prepara tus cambios"


Estoy tratando de aplicar los cambios que almacené anteriormente con git stash pop y obtener el mensaje:

Cannot apply to a dirty working tree, please stage your changes

¿Alguna sugerencia sobre cómo lidiar con eso?

 128
Author: avernet, 2009-09-01

11 answers

Cuando tengo que aplicar cambios ocultos a una copia de trabajo sucia, por ejemplo, pop más de un conjunto de cambios desde el alijo, utilizo lo siguiente:

$ git stash show -p | git apply -3 && git stash drop

Básicamente es

  1. crea un parche
  2. canalizaciones que al comando apply
  3. si hay algún conflicto que tendrá que ser resuelto a través de 3-way merge
  4. si apply (o merge) tiene éxito, suelta el elemento alijo recién aplicado...

Me pregunto por qué no hay una opción -f (fuerza) para git stash pop que debería comportarse exactamente como el de arriba.

Mientras tanto, es posible que desee agregar este one-liner como un alias de 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 parámetro -3 que permite resolver conflictos directamente a través de la fusión de 3 vías.

 191
Author: muhqu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-29 06:41:22

Lo hago de esta manera:

git add -A
git stash apply

Y luego (opcionalmente):

git reset
 49
Author: Sergii Mostovyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-24 08:59:03

Puede hacer esto sin tener que almacenar sus cambios actuales exportando el almacenamiento que desee como un archivo de parche y aplicándolo manualmente.

Por ejemplo, supongamos que desea aplicar stash@{0} a un árbol sucio:

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

    Git stash show-p stash@{0} > Stash0.parche

  2. Aplicar manualmente los cambios:

    Git apply Stash0.parche

Si el segundo paso falla, tendrá que editar el alijo 0.parche archivo para corregir cualquier error y luego pruebe git apply de nuevo.

 9
Author: Ishan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-03-30 22:44:18

Limpie su directorio de trabajo con git reset, confirme los cambios o, si desea guardar los cambios actuales, intente:

$ git stash save "description of current changes"
$ git stash pop stash@{1}

Esto almacenará los cambios actuales, y luego pop el segundo alijo de la pila de alijo.

 8
Author: William Pursell,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-01 06:04:24

La solución de Mathias es definitivamente la más cercana a un git stash pop force force (y realmente, vamos desarrolladores de Git, vamos a obtener esta opción ya!)

Sin embargo, si quieres hacer lo mismo usando solo comandos de git, puedes:

  1. git commit-a-m"Fixme"
  2. git stash pop
  3. git commit - a amend amend
  4. git reset HEAD~

En otras palabras, haz un commit (que nunca publicaremos) de tus cambios actuales. Ahora que su espacio de trabajo está limpio, pop su alijo. Ahora, confirma los cambios del alijo como una enmienda a tu confirmación anterior. Una vez hecho esto, ahora tiene ambos conjuntos de cambios combinados en un solo commit ("Fixme"); simplemente restablezca (soft soft NO hard hard para que nada se pierda realmente) su checkout a "uno antes de ese commit", y ahora tiene ambos conjuntos de cambios, completamente sin confirmar.

**EDITAR**

Me acabo de dar cuenta de que en realidad es aún más fácil; puedes omitir completamente el paso 3, así que ...

  1. git commit-a-m"Fixme"
  2. git stash pop
  3. git reset HEAD~

(Confirma los cambios actuales, saca los cambios guardados, restablece esa primera confirmación para obtener ambos conjuntos de cambios combinados en un estado sin confirmar.)

 6
Author: machineghost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-04-17 18:17:36

Ninguna de estas respuestas realmente funciona si te encuentras en esta situación como lo hice hoy. Sin importar cuántos git reset --hard hice, no me llevó a ninguna parte. Mi respuesta (no oficial de ninguna manera fue):

  1. Averigua el uso de hash del alijo git reflog --all
  2. Combina ese hash con la rama que te interesa
 4
Author: Dan Rosenstark,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-10-28 05:35:14

También encontré la solución de Mathias Leppich funciona muy bien, así que agregué un alias a mi global .gitconfig

[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 mí.

(Su kilometraje puede variar en este nombre de alias largo. Pero me gusta una dosis de verbosidad cuando se trata de completar bash.)

 4
Author: mat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:17

Puede aplicar un alijo a un árbol "sucio" haciendo un git add para organizar cualquier cambio que haya realizado, limpiando así el árbol. Luego puede git stash pop y aplicar los cambios guardados, sin problema.

 3
Author: Chris Vandevelde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-20 19:33:58

Tiene archivos que han sido modificados pero no confirmados. O bien:

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
 2
Author: brool,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-09-01 05:54:01

Tuve el mismo problema pero git tenía cero archivos cambiados. Resulta que tenía un índice.archivo de bloqueo que estaba por ahí. Eliminarlo resolvió el problema.

 0
Author: boxed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-16 15:19:11

No pude hacer que la mayoría de estos funcionaran; 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 fallan. Lo que finalmente funcionó fue guardar el stash como una rama con git stash branch tempbranchname, y luego hacer una fusión de ramas 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 de nuevo, puede ejecutar la rama git stash, que crea una nueva rama para usted, echa un vistazo el commit en el que estaba cuando escondió su trabajo, vuelve a aplicar su trabajo allí, y luego deja caer el alijo si se aplica con éxito

 0
Author: rwilson04,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-22 23:28:54