2011-07-01 13 views
151

oculté algunos cambios locales antes de hacer una fusión complicada, hice la fusión, luego olvidé tontamente comprometerme antes de ejecutar git stash pop. El pop creó algunos problemas (llamadas de método incorrecto en una gran base de código) que están resultando difíciles de rastrear. Ejecuté git stash show, así que al menos sé qué archivos fueron cambiados. Si nada más, supongo que esta es una lección para cometer más.Deshacer el git alsh del pop

Mi pregunta: ¿es posible deshacer el stash pop sin también deshacer la fusión?

+2

Se supone que no se le permite 'git stash pop' sin comprometerse primero. ¿Qué hiciste para lograr eso? –

+0

No estoy seguro de ser sincero (esto fue ayer). La fusión no se cometió por sí sola porque hubo conflictos. De alguna manera pude ejecutar stash pop después de eso. – nren

+0

Lo hice solo saber usar la versión de Git 1.7.9.msysgit.0. Tenía archivos no almacenados y el alijo escondido simplemente fusionó todo. – PandaWood

Respuesta

58

Pruebe usar How to recover a dropped stash in Git? para encontrar el alijo que extrajo. Creo que siempre hay dos confirmaciones para un alijo, ya que conserva el índice y la copia de trabajo (por lo tanto, la confirmación del índice estará vacía). Luego git show para ver la diferencia y use patch -R para desaplicarlos.

+6

Wow that funcionó. Pude encontrar los commit stash con 'git fsck --no-reflog | awk '/ colgar commit/{print $ 3}' '(del enlace), y simplemente encontré el problema manualmente desde esa diferencia. ¡Gracias! – nren

+0

el fsck produce una gran lista. Es tedioso mostrar todos los SHA1 que hay. Cómo haces esto ? – meson10

+3

@ meson10: Desafortunadamente los escondites se guardan en un reflog, que sería la manera obvia (si fueran una sucursal real) de mirar la historia de los escondites reventados. También permítanme sugerir que una solicitud de ayuda de downvote + no es la mejor estrategia. –

28

De git stash --help

Recovering stashes that were cleared/dropped erroneously 
    If you mistakenly drop or clear stashes, they cannot be recovered through the normal safety mechanisms. However, you can try the 
    following incantation to get a list of stashes that are still in your repository, but not reachable any more: 

     git fsck --unreachable | 
     grep commit | cut -d\ -f3 | 
     xargs git log --merges --no-walk --grep=WIP 

Esto me ayudó mejor que la respuesta aceptada con el mismo escenario.

+8

Tenga en cuenta que muchas soluciones que implican buscar "WIP" se basan en los mensajes ocultos predeterminados. Si le da a sus stashes mensajes explícitos, es posible que no contengan WIP. –

+0

gracias. Agregué la opción --oneline al comando de registro para mejorar la legibilidad. – basslo

0

No Si su fusión era demasiado complicado otra opción sería:

  1. mover todos los cambios que incluyen la fusión cambios de nuevo para guardar usando "escondite git"
  2. ejecutar la combinación de nuevo y confirmar los cambios (sin los cambios del stash que se cayó)
  3. Ejecuta un "git stash pop" que debería ignorar todos los cambios de tu combinación anterior ya que los archivos son idénticos ahora.

Después de eso, solo le quedan los cambios del alijo que cayó demasiado pronto.