¿Cómo invertir la aplicación de un alijo?

Tengo un pequeño parche guardado en mi git stash. Lo he aplicado a mi copia de trabajo usando git stash apply. Ahora, me gustaría revertir esos cambios aplicando el parche a la inversa (algo parecido a lo que haría git revert pero contra el stash).

¿Alguien sabe cómo hacerlo?

Aclaración: Hay otros cambios en mi copia de trabajo. Mi caso particular es difícil de describir pero puedes imaginar algún código de depuración o experimental que'está en el stash. Ahora está mezclado en mi copia de trabajo con algunos otros cambios y me gustaría ver el efecto con y sin los cambios del alijo.

No parece que stash soporte esto actualmente, pero un git stash apply --reverse sería una buena característica.

Solución

Según la git-stash manpage, "Un stash se representa como un commit cuyo árbol registra el estado del directorio de trabajo, y su primer padre es el commit en HEAD cuando se creó el stash," y git stash show -p nos da "los cambios registrados en el stash como un diff entre el estado stashed y su padre original.

Para mantener tus otros cambios intactos, usa git stash show -p | patch --reverse como en lo siguiente:

$ git init
Initialized empty Git repository in /tmp/repo/.git/

$ echo Hello, world >messages

$ git add messages

$ git commit -am 'Initial commit'
[master (root-commit)]: created 1ff2478: "Initial commit"
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 messages

$ echo Hello again >>messages

$ git stash

$ git status
# On branch master
nothing to commit (working directory clean)

$ git stash apply
# On branch master
# Changed but not updated:
#   (use "git add ..." to update what will be committed)
#   (use "git checkout -- ..." to discard changes in working directory)
#
#       modified:   messages
#
no changes added to commit (use "git add" and/or "git commit -a")

$ echo Howdy all >>messages

$ git diff
diff --git a/messages b/messages
index a5c1966..eade523 100644
--- a/messages
+++ b/messages
@@ -1 +1,3 @@
 Hello, world
+Hello again
+Howdy all

$ git stash show -p | patch --reverse
patching file messages
Hunk #1 succeeded at 1 with fuzz 1.

$ git diff
diff --git a/messages b/messages
index a5c1966..364fc91 100644
--- a/messages
+++ b/messages
@@ -1 +1,2 @@
 Hello, world
+Howdy all

Editar:

Una ligera mejora a esto es usar git apply en lugar de patch:

git stash show -p | git apply --reverse

Alternativamente, también puedes usar git apply -R como abreviatura de git apply --reverse.

He encontrado esto muy útil últimamente...

Comentarios (8)

git stash[save] toma el estado de tu directorio de trabajo, y el estado de tu índice, y los almacena, estableciendo el índice y el área de trabajo a la versión HEAD.

git stash applyrecupera esos cambios, por lo quegit reset --hard` los eliminaría de nuevo.

git stash poprecupera esos cambios y elimina el cambio almacenado en la parte superior, por lo quegit stash [save]` volvería al estado anterior (pre-pop) en este caso.

Comentarios (0)

Hace tiempo que debería haber hecho esto, pero si interpreto el problema correctamente he encontrado una solución sencilla, nota, esto es una explicación en mi propia terminología:

git stash [save] guardará los cambios actuales y establecerá su rama actual al "estado limpio"

git stash list da algo como: stash@{0}: On develop: saved testing-stuff

git apply stash@{0} establecerá la rama actual como antes de stash [save]

git checkout . Establecerá la rama actual como after stash [save]

El código que se guarda en el alijo no se pierde, puede ser encontrado por git apply stash@{0} de nuevo.

¡En cualquier caso, esto funcionó para mí!

Comentarios (1)