remove - git tags best practices
¿Cómo revertir la aplicación de un alijo? (6)
Además de la respuesta de @Greg Bacon, en caso de que se hayan agregado archivos binarios al índice y hayan sido parte del alijo usando
git stash show -p | git apply --reverse
puede resultar en
error: cannot apply binary patch to ''<YOUR_NEW_FILE>'' without full index line
error: <YOUR_NEW_FILE>: patch does not apply
Agregar --binary
resuelve el problema, pero desafortunadamente aún no se ha explicado por qué.
git stash show -p --binary | git apply --reverse
Tengo un pequeño parche guardado en mi escondite. Lo he aplicado a mi copia de trabajo usando git stash apply
. Ahora, me gustaría revertir esos cambios aplicando el parche de forma inversa (algo así como lo que haría git revert
pero en contra del alijo).
¿Alguien sabe como hacer esto?
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 alijo. 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 lo soporte actualmente, pero se git stash apply --reverse
un git stash apply --reverse
sería una buena característica.
Corte directo y pegado de la página de manual de git Está claramente redactado e incluso incluye un alias;
Desinstalar un Stash En algunos escenarios de casos de uso, es posible que desee aplicar cambios escondidos, hacer algún trabajo, pero luego quitar los cambios que originalmente provienen del alijo. Git no proporciona un comando de aplicación de stash, pero es posible lograr el efecto simplemente recuperando el parche asociado a un alijo y aplicándolo en reversa:
$ git stash show -p stash@{0} | git apply -R
De nuevo, si no especifica un alijo, Git asume el alijo más reciente:
$ git stash show -p | git apply -R
Es posible que desee crear un alias y agregar efectivamente un comando stash-unpply a su Git. Por ejemplo:
$ git config --global alias.stash-unapply ''!git stash show -p | git apply -R''
$ git stash apply
$ #... work work work
$ git stash-unapply
De acuerdo con la página de manual de git-stash , "Un alijo 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 alijo", y git stash show -p
nos da "los cambios registrados en el alijo como una diferencia entre el estado escondido y su padre original.
Para mantener sus otros cambios intactos, use git stash show -p | patch --reverse
git stash show -p | patch --reverse
como en el 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 de esto es usar git apply
en lugar del parche:
git stash show -p | git apply --reverse
Alternativamente, también puede usar git apply -R
como una abreviatura para git apply --reverse
.
He estado encontrando esto realmente útil últimamente ...
Esto es muy tarde, pero si interpenetrar el problema correctamente he encontrado una solución simple, nota, esta es una explicación en mi propia terminología:
git stash [save]
guardará los cambios actuales y establecerá su rama actual en el "estado limpio"
git stash list
da algo así 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 después de stash [save]
El código que se guarda en el alijo no se pierde, se puede encontrar por git apply stash@{0}
nuevamente.
Anywhay, ¡esto funcionó para mí!
git stash
[save]
toma el estado de su directorio de trabajo, y su estado de índice, y los esconde, estableciendo el índice y el área de trabajo en la versión HEAD
.
git stash apply
trae de vuelta esos cambios, por lo que git reset --hard
los eliminaría nuevamente.
git stash pop
recupera esos cambios y elimina el cambio superior oculto, por lo que git stash [save]
volvería al estado anterior (pre-pop) en este caso.
git checkout -f
eliminará cualquier cambio no comprometido.