132 votos

Git stash: "No se puede aplicar a un sucio árbol de trabajo, por favor, la etapa de los cambios"

Estoy tratando de aplicar los cambios me ha escondido anterior con git stash pop y el mensaje:

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

Cualquier sugerencia sobre cómo lidiar con eso?

195voto

muhqu Puntos 2828

Cuando tengo que aplicar escondido cambios a una mala copia de trabajo, por ejemplo. pop más que un conjunto de cambios de la caleta, yo uso el siguiente:

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

Básicamente se

  1. crea un parche
  2. las tuberías que para el comando aplicar
  3. si hay cualquier conflicto que tendrá que ser resuelto a través de 3-modo de mezcla
  4. si se aplican (o combinación) logró terminar la acaba de aplicar stash elemento...

Me pregunto por qué no hay -f (fuerza) opción para git stash pop que exactamente debe comportarse como el one-liner de arriba.

En el mientras tanto, es posible que desee añadir a 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 para señalar las -3 parámetro que permite resolver los conflictos directamente a través de 3-modo de mezcla.

57voto

sergey_mo Puntos 232

Yo lo hago de esta manera:

git add -A
git stash apply

y, a continuación, (opcionalmente):

git reset

9voto

Ishan Puntos 867

Usted puede hacer esto sin tener que guardar los cambios actuales mediante la exportación de la mercancía que desea como un archivo de parche y aplicar manualmente.

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

  1. La exportación de stash@{0} como un parche:

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

  2. Aplicar manualmente los cambios:

    git aplicar Stash0.patch

Si el segundo paso no funciona, usted tendrá que editar el Stash0.patch archivo para corregir errores y, a continuación, intente git aplicar de nuevo.

8voto

William Pursell Puntos 56211

Limpie bien su directorio de trabajo con git reset, confirmar los cambios, o bien, si desea guardar los cambios actuales, la prueba:

$ git stash guardar "descripción de cambios en la corriente"
$ git stash pop stash@{1}

Esto va a guardar los cambios actuales, y a continuación, el pop en el segundo alijo de el almacen de la pila.

6voto

machineghost Puntos 9864

Mathias la solución es, definitivamente, la más cercana a un git stash pop --force (y realmente, vamos Git devs, vamos a conseguir que esta opción ya!)

Sin embargo, si usted quiere hacer lo mismo utilizando sólo los comandos de git, usted puede:

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

En otras palabras, hacer un commit (que nunca podremos push) de los cambios actuales. Ahora que su trabajo es limpio, pop su stash. Ahora, cometer el alijo de los cambios como una enmienda a la anterior commit. Después de haber hecho de que ahora tiene dos conjuntos de cambios combinados en un único commit ("Fixme"); reset (--suave-duro, así que nada está perdido) su compra para que "antes que cometer", y ahora usted tiene dos conjuntos de cambios, completamente comprometidos.

**EDIT**

Simplemente me di cuenta que en realidad es aún más fácil; puede omitir el paso 3, así que ...

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

(Commit de los cambios actuales, pop fuera de la guardados los cambios, restablecer la primera se comprometan a conseguir que ambos conjuntos de cambios, combinados en un estado sin confirmar.)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X