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.
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 <file>..." to update what will be committed)
# (use "git checkout -- <file>..." 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...
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 que
git reset --hard` los eliminaría de nuevo.
git stash poprecupera esos cambios y elimina el cambio almacenado en la parte superior, por lo que
git stash [save]` volvería al estado anterior (pre-pop) en este caso.
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í!