¿Cómo cancelar un pop de alijo?

Resuelto Casebash asked hace 13 años • 16 respuestas

Abrí un alijo y hubo un conflicto de fusión. A diferencia de la pregunta que aparece como duplicada, ya tenía algunos cambios no confirmados en el directorio que quería conservar. No solo quiero que desaparezca el conflicto de fusión, sino también que mi directorio vuelva al estado que tenía antes del pop.

Lo intenté git merge --abort, pero git afirmó que no había ninguna fusión en curso. ¿Existe una manera fácil de cancelar una ventana emergente sin destruir los cambios que tenía originalmente en el directorio?

Casebash avatar Dec 15 '11 12:12 Casebash
Aceptado

Una sola línea simple

siempre he usado

git reset --merge

No recuerdo que haya fallado nunca.


Nota: git reset --mergedescartará cualquier cambio por etapas. Además, como señaló @Saroopashree Kumaraguru en los comentarios, el contenido oculto no se perderá y podrá volver a aplicarse más tarde.

Kenn Sebesta avatar Feb 28 '2020 02:02 Kenn Sebesta

Mi caso de uso: intenté acceder a la rama equivocada y obtuve conflictos. Todo lo que necesito es deshacer la ventana emergente pero mantenerla en la lista de almacenamiento para poder abrirla en la rama correcta. Hice esto:

git reset HEAD --hard
git checkout my_correct_branch
git stash pop

Fácil.

jmoz avatar Apr 07 '2015 16:04 jmoz

Ok, creo que he resuelto "git stash unaapply". Es más complejo git apply --reverseporque necesita una acción de fusión inversa en caso de que el archivo git stash apply.

La combinación inversa requiere que todos los cambios actuales se inserten en el índice:

  • git add -u

Luego invierte lo merge-recursiveque fue hecho por git stash apply:

  • git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1

Ahora solo te quedarán los cambios que no están ocultos. Estarán en el índice. Puede utilizar git resetpara eliminar los cambios si lo desea.

Dado que el original git stash applyfalló, supongo que lo contrario también podría fallar, ya que algunas de las cosas que quiere deshacer no se hicieron.

Aquí hay un ejemplo que muestra cómo la copia de trabajo (a través de git status) termina limpia nuevamente:

 $ git status
# On branch trunk
nothing to commit (working directory clean)
 $ git stash apply
Auto-merging foo.c
# On branch trunk
# 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:   foo.c
#
no changes added to commit (use "git add" and/or "git commit -a")
 $ git add -u
 $ git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Auto-merging foo.c
 $ git status
# On branch trunk
nothing to commit (working directory clean)
Ben Jackson avatar Jan 22 '2013 01:01 Ben Jackson