Tengo un pequeño parche guardado en mi escondite de git. Lo he aplicado a mi copia de trabajo usando git stash apply
. Ahora, me gustaría retroceder esos cambios aplicando el parche en reversa (algo así como lo git revert
que haría 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 puede imaginarse algún código de depuración o experimental que esté en el escondite. 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 admita actualmente, pero git stash apply --reverse
sería una buena característica.
Respuestas:
Según 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 el
HEAD
momento en que se creó el alijo", ygit stash show -p
nos da "los cambios registrados en el alijo como diferencia entre el estado oculto y su padre original.Para mantener sus otros cambios intactos, use
git stash show -p | patch --reverse
lo siguiente:Editar:
Una mejora ligera para esto es usar
git apply
en lugar del parche:Alternativamente, también puede usar
git apply -R
como una forma abreviada degit apply --reverse
.He estado encontrando esto realmente útil últimamente ...
fuente
git apply -R
es una mejora, al menos para mí en mi ventana de Windows con git bash, ya quepatch --reverse
tuve problemas para localizar el archivo para parchear (no tengo ni idea de por qué funcionó la alternativa). +1 y buena explicación--index
asígit stash show -p | git apply --reverse --index
? Debido a que ya no necesita agregar en el índice los cambios que se revierten.git stash show -p | git apply -R -v
con el mensaje:Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1
. ¿Sabe lo que podría estar mal?git stash
[save]
toma su estado de directorio de trabajo y su estado de índice, y los guarda, configurando el índice y el área de trabajo enHEAD
versión.git stash apply
recupera esos cambios, porgit reset --hard
lo que los eliminaría nuevamente.git stash pop
recupera esos cambios y elimina el cambio oculto superior, porgit stash [save]
lo que volvería al estado anterior (pre-pop) en este caso.fuente
eliminará cualquier cambio que no sea de confirmación.
fuente
La página de manual de V1 git tenía una referencia sobre la eliminación de la aplicación de un alijo. El extracto está abajo.
La nueva página de manual de git de V2 no incluye ninguna referencia a la eliminación de la aplicación de un alijo, pero el siguiente sigue funcionando bien
Desinstalar un alijo En algunos escenarios de casos de uso, es posible que desee aplicar cambios escondidos, hacer algo de trabajo, pero luego des-aplicar los cambios que originalmente vinieron del alijo. Git no proporciona un comando de desaplicación de escondite, pero es posible lograr el efecto simplemente recuperando el parche asociado con un escondite y aplicándolo en reversa:
Nuevamente, si no especificas un alijo, Git asume el alijo más reciente:
Es posible que desee crear un alias y agregar efectivamente un comando stash-nopply a su Git. Por ejemplo:
fuente
Esto ya se ha vencido, pero si interpreto el problema correctamente, he encontrado una solución simple, tenga en cuenta que 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 como:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
establecerá la rama actual como antesstash [save]
git checkout .
Establecerá la rama actual como despuésstash [save]
El código que se guarda en el alijo no se pierde, se puede volver a encontrar
git apply stash@{0}
.De todos modos, esto funcionó para mí!
fuente
git stash apply --reverse
primero y luego simplemente volví agit stash apply stash@{x}
gustarme. Trabajó sin problemas.Aparte de lo que otros han mencionado, la forma más fácil es hacer primero
y luego verifique todos los cambios locales
fuente
Además de la respuesta de @Greg Bacon, en caso de que se agregaran archivos binarios al índice y formaran parte del alijo usando
puede resultar en
Agregar
--binary
resuelve el problema, pero desafortunadamente aún no he descubierto por qué.fuente
Puede seguir la imagen que compartí para desangrar si tocó accidentalmente el alijo.
fuente
Esto se suma a las respuestas anteriores, pero agrega la búsqueda del alijo git en función del mensaje, ya que el número de alijo puede cambiar cuando se guardan nuevos alijos. He escrito un par de funciones bash:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"
fuente