Abrí un alijo y hubo un conflicto de fusión. A diferencia de la pregunta que aparece como duplicado, ya tenía algunos cambios no confirmados en el directorio que quería conservar. No solo quiero hacer desaparecer el conflicto de fusión, sino también hacer que mi directorio vuelva al estado anterior al pop.
Lo intenté git merge --abort
, pero git afirmó que no había ninguna fusión en curso. ¿Hay una manera fácil de abortar un pop sin destruir los cambios que originalmente tuve en el directorio?
git stash pop
un directorio de trabajo impuro. En cuyo caso, puede simplementegit reset --hard
y su alijo todavía está intacto. (Esto es más o menos lo que sugiere el tema vinculado de @ BradKoch)Respuestas:
Ok, creo que he resuelto "git stash sin aplicar". Es más complejo que
git apply --reverse
porque necesita una acción de fusión inversa en caso de que la fusión la haya realizadogit stash apply
.La fusión inversa requiere que todos los cambios actuales se introduzcan en el índice:
git add -u
Luego invierta lo
merge-recursive
que hizogit stash apply
:git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Ahora solo te quedarán los cambios que no sean alijo. Estarán en el índice. Puede usar
git reset
para desestabilizar sus cambios si lo desea.Dado que su 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 (vía
git status
) termina limpia nuevamente:fuente
git stash apply
nunca deja caer un alijo, y cuando falla una fusión,git stash pop
también retiene el alijoMi caso de uso: solo intenté aparecer en la rama incorrecta y obtuve conflictos. Todo lo que necesito es deshacer el pop, pero mantenerlo en la lista oculta para que pueda salir en la rama correcta. Hice esto:
Fácil.
fuente
stash pop
él. Eso suena como una receta para el desastre.Editar: de la
git help stash
documentación en la sección emergente:Aplicar el estado puede fallar con los conflictos; en este caso, no se elimina de la lista oculta. Debe resolver los conflictos a mano y llamar a git stash drop manualmente después.
Si se utiliza la opción --index, intenta restablecer no solo los cambios del árbol de trabajo, sino también los cambios del índice. Sin embargo, esto puede fallar cuando tiene conflictos (que se almacenan en el índice, por lo que ya no puede aplicar los cambios como estaban originalmente).
Intente copiar todo su repositorio en un nuevo directorio (para que tenga una copia del mismo) y ejecute:
git stash show
y guarde esa salida en algún lugar si le importa.entonces:
git stash drop
para soltar el alijo en conflicto entonces:git reset HEAD
Eso debería dejar su repositorio en el estado que tenía antes (con suerte, todavía no he podido reprobar su problema)
===
Estoy tratando de reprochar tu problema, pero todo lo que obtengo cuando usin
git stash pop
es:En un directorio limpio:
No veo a git tratando de fusionar mis cambios, simplemente falla. ¿Tienes algún paso de repro que podamos seguir para ayudarte?
fuente
Siempre he usado
git reset --merge
No puedo recordar que nunca haya fallado.
fuente
git reset
. ¿Sabes si es funcionalmente idéntico agit reset --merge
?Si no tiene que preocuparse por ningún otro cambio que haya realizado y solo desea volver a la última confirmación, puede hacer lo siguiente:
fuente
OK, creo que he logrado encontrar un flujo de trabajo que lo llevará de regreso a donde necesita estar (como si no hubiera hecho el pop).
HAGA UNA COPIA DE SEGURIDAD ANTES! No sé si esto funcionará para usted, así que copie todo su repositorio en caso de que no funcione.
1) Solucione los problemas de fusión y solucione todos los conflictos seleccionando todos los cambios que provienen del parche (en tortoisemerge, esto se muestra como one.REMOETE (suyo)).
2) Confirme estos cambios (ya se agregarán mediante el comando mergetool). Dele un mensaje de compromiso de "fusión" o algo que recuerde.
3) Ahora aún tendrá sus cambios locales sin etapas que comenzó originalmente, con una nueva confirmación del parche (podemos deshacernos de esto más adelante). Ahora confirma tus cambios no organizados
4) Invierta el parche. Esto se puede hacer con el siguiente comando:
5) Cometer estos cambios:
6) Deshazte de los parches / descomprime confirmaciones
a partir de esto, elimine las dos líneas con 'fusionar' y 'parche invertido'.
7) Recupere sus cambios sin cambios y deshaga el compromiso de 'cambios locales'
Lo he revisado con un ejemplo simple y lo lleva de regreso a donde desea estar, directamente antes de que se descubriera el alijo, con sus cambios locales y con el alijo todavía disponible para reventar.
fuente
git stash show -p | git apply -R
eso no funciona si segit stash apply
hizo una fusión real. Mira mi respuesta ...Resolví esto de una manera algo diferente. Esto es lo que pasó.
Primero, aparecí en la rama equivocada y obtuve conflictos. El alijo permaneció intacto pero el índice estaba en resolución de conflictos, bloqueando muchos comandos.
Un simple
git reset HEAD
abortó la resolución del conflicto y dejó los cambios no comprometidos (y NO DESEADOS ).Varios
git co <filename>
volvieron el índice al estado inicial. Finalmente, cambié de ramagit co <branch-name>
y ejecuté una nuevagit stash pop
, que se resolvió sin conflictos.fuente
Algunas ideas:
Use
git mergetool
para dividir los archivos de fusión en partes originales y nuevas. Con suerte, uno de esos es el archivo con sus cambios que no son de escondite.Aplique la diferencia de la reserva al revés, para deshacer solo esos cambios. Probablemente tendrá que dividir manualmente los archivos con los conflictos de fusión (que con suerte el truco anterior funcionará).
No probé ninguno de estos, así que no estoy seguro de que funcionen.
fuente
Podría reproducir limpio
git stash pop
en el directorio "sucio", con cambios no confirmados, pero aún no emergente que genera un conflicto de fusión.Si al fusionar el conflicto, el alijo que intentó aplicar no desapareció, puede intentar examinar
git show stash@{0}
(opcionalmente con--ours
o--theirs
) y comparar congit statis
ygit diff HEAD
. Debería poder ver qué cambios provienen de la aplicación de un alijo.fuente
Si DavidG está en lo correcto al decir que no apareció el alijo debido al conflicto de fusión, entonces simplemente necesita limpiar su directorio de trabajo. Rápidamente
git commit
todo lo que te importa. (Puedereset
o puedesquash
confirmar más tarde si no ha terminado). Luego, con todo lo que le importa a salvo,git reset
todo lo demás quegit stash pop
volcó en su directorio de trabajo.fuente
Si no hubo cambios por etapas antes del
git stash pop
, como en la pregunta, entonces los dos comandos siguientes deberían funcionar.El primero revierte cualquier fusión del alijo, exitoso o no. El segundo elimina cualquier archivo sin seguimiento introducido por el alijo.
De
man git stash
:The working directory must match the index.
que @DavidG señala,stash pop
fallará si alguno de los archivos modificados actualmente no en escena entra en conflicto. Como tal, no deberíamos tener que preocuparnos por resolver conflictos de fusión más allá de volver aHEAD
. Los archivos modificados restantes no están relacionados con el alijo y se modificaron antes delstash pop
Si hubo cambios por etapas, no estoy claro si podemos confiar en los mismos comandos y es posible que desee probar la técnica de @Ben Jackson. Sugerencias apreciadas ..
Aquí hay una configuración de prueba para todos los diversos casos https://gist.github.com/here/4f3af6dafdb4ca15e804
fuente
Use
git reflog
para enumerar todos los cambios realizados en su historial de git. Copie una identificación de acción y escribagit reset ACTION_ID
fuente
Estoy publicando aquí esperando que otros puedan encontrar mi respuesta útil. Tuve un problema similar cuando traté de hacer un escondite en una rama diferente de la que había escondido. En mi caso, no tenía archivos no confirmados o en el índice, pero aún me metí en el caso de conflictos de fusión (el mismo caso que @pid). Como otros señalaron anteriormente, el git stash pop fallido realmente conservó mi alijo, luego un git reset HEAD plus rápido volviendo a mi rama original y haciendo el alijo desde allí resolvió mi problema.
fuente