tipos tag remove practices etiquetas crear commits commands best git git-stash

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.