¿Cómo cancelar un pop de alijo?
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?
Una sola línea simple
siempre he usado
git reset --merge
No recuerdo que haya fallado nunca.
Nota: git reset --merge
descartará 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.
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.
Ok, creo que he resuelto "git stash unaapply". Es más complejo git apply --reverse
porque 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-recursive
que 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 reset
para eliminar los cambios si lo desea.
Dado que el original git stash apply
falló, 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)