Deshacer git stash pop que da como resultado un conflicto de fusión

520

Comencé a hacer cambios en mi base de código, sin darme cuenta de que estaba en una rama de tema antigua. Para transferirlos, quería guardarlos y luego aplicarlos a una nueva rama fuera del maestro. Solía git stash poptransferir los cambios de trabajo en progreso a esta nueva rama, olvidando que no había introducido nuevos cambios en el maestro antes de crear la nueva rama. Esto dio lugar a un montón de conflictos de fusión y la pérdida de un alijo limpio de mis cambios (ya que usé pop).

Una vez que vuelva a crear la nueva rama correctamente, ¿cómo puedo recuperar mis cambios escondidos para aplicarlos correctamente?

acjay
fuente

Respuestas:

658

Como resultado, Git es lo suficientemente inteligente como para no dejar caer un alijo si no se aplica limpiamente. Pude llegar al estado deseado con los siguientes pasos:

  1. Para desestabilizar los conflictos de fusión: git reset HEAD .(observe el punto final)
  2. Para guardar la fusión en conflicto (por si acaso): git stash
  3. Para volver al maestro: git checkout master
  4. Para obtener los últimos cambios: git fetch upstream; git merge upstream/master
  5. Para corregir mi nueva sucursal: git checkout new-branch; git rebase master
  6. Para aplicar los cambios escondidos correctos (ahora segundo en la pila): git stash apply stash@{1}
acjay
fuente
14
¡Excelente, gracias! # 6 es realmente la respuesta que estaba buscando. Podría agregar a git stash dropcomo el último paso para deshacerse del alijo no deseado del # 2.
austinmarton
2
# 2 no funcionará si hay rutas no fusionadas, en su lugar generará el error descrito aquí: stackoverflow.com/questions/5483213/…
Étienne
55
No es totalmente cierto: Git mantendrá el alijo en la lista de alijo si no se aplicó de manera limpia. Consulte estos documentos sobre git stash pop: "La aplicación del estado puede fallar con los conflictos; en este caso, no se elimina de la lista de ocultación. Debe resolver los conflictos a mano y llamar git stash dropmanualmente después". ( git-scm.com/docs/git-stash )
Carolyn Conway el
44
Es extraño cómo esta respuesta y la pregunta se publican exactamente en el mismo minuto
llámame
14
@ call-me ¡Esto es algo que creo que la gente debería hacer más a menudo! Observe cómo el formulario "Hacer una pregunta" tiene una casilla de verificación que le permite responder su propia pregunta en el mismo formulario :). Esto me sucede a veces cuando estoy en el proceso de autoría de una pregunta que me está confundiendo, pero al tratar de ajustar la pregunta para que sea buena para StackOverflow, termino descubriendo la solución. Esto fue hace un tiempo, así que no recuerdo si ese fue el caso aquí, pero supongo que eso fue lo que sucedió.
acjay
342

Por suerte git stash popno no cambie el alijo en el caso de un conflicto!

Así que nada, de qué preocuparse, simplemente limpie su código y vuelva a intentarlo.

Digamos que su base de código estaba limpia antes, podría volver a ese estado con: git checkout -f
Luego, haga las cosas que olvidó, por ejemplo, git merge missing-branch
después de eso simplemente dispare git stash popnuevamente y obtenga el mismo alijo, que entró en conflicto antes.

Atención: el alijo es seguro, sin embargo, los cambios no confirmados en el directorio de trabajo no lo son. Pueden enredarse.

flori
fuente
16
Lo que entiendo es que simplemente puede limpiar y volver a abrir, pero no puede deshacerlo . Si el pop se mezcla con otros cambios no confirmados, entonces debe limpiarlo manualmente.
haridsv
Esta es una solución muy simple y funcionó muy bien para mí. Se supone que puede revertir todo lo que ha cambiado localmente (no hubo cambios antes / después de que se descubriera el alijo), lo que creo que funciona para la mayoría de las situaciones. Si necesita guardar algunos cambios adicionales que ocurrieron antes de darse cuenta de que esto era un problema, debería poder confirmar esos archivos antes de forzar un pago en la mayoría de los casos.
Proyecto707
Este no fue el caso para mí. Lo llamé git stash popintento de fusión automática, en conflicto y lo guardé.
Trevor Hickey
1
@TrevorHickey El punto de esta respuesta fue que el alijo permanece como está en caso de conflicto, que puede llamar git stash popcon la frecuencia que necesite hasta que termine sin conflicto. Entonces, después de su conflicto, sí, el directorio de trabajo está en desorden, sin embargo, puede limpiarlo y git stash popvolver a llamar .
flori
55
Este comando para deshacer la última aplicación de alijo es muy útil git checkout -f:!
Lefi Tarik
16

Las instrucciones aquí son un poco complicadas, así que voy a ofrecer algo más sencillo:

  1. git reset HEAD --hard Abandonar todos los cambios a la rama actual

  2. ... Realizar trabajos intermedios según sea necesario

  3. git stash pop Vuelva a abrir el alijo nuevamente en una fecha posterior cuando esté listo

anon58192932
fuente
8
git checkout -f

debe funcionar, si su estado anterior es limpio.

Allahbakash.G
fuente