Cofanie przypadkowego pop git stash pop


186

Założyłem kilka lokalnych zmian przed wykonaniem skomplikowanego scalenia, scaliłem, a potem głupio zapomniałem zatwierdzić przed uruchomieniem git stash pop. Pop stworzył pewne problemy (złe wywołania metod w dużej bazie kodu), które są trudne do wyśledzenia. Uruchomiłem git stash show, więc przynajmniej wiem, które pliki zostały zmienione. Jeśli nic więcej, myślę, że to lekcja, by popełnić więcej.

Moje pytanie: czy można cofnąć ukryty pop bez cofania scalania?


2
Nie wolno ci tego robić git stash popbez wcześniejszego zobowiązania. Co zrobiłeś, aby to osiągnąć?
Chris Jester-Young

Nie jestem szczery (to było wczoraj). Scalenie nie zostało popełnione samodzielnie, ponieważ wystąpiły konflikty. Po tym jakoś udało mi się uruchomić stash pop.
nren

1
Zrobiłem to tylko wiem, używając git w wersji 1.7.9.msysgit.0. Miałem pliki niestacjonarne, a stash pop po prostu połączył wszystko.
PandaWood,

Byłem w stanie uruchomić git stash poppo wprowadzeniu zmian (nie popełniłem jednak) z wersją git
2.25.0.windows.1

Jeśli zaindeksowałeś zmiany i straciłeś je podczas uruchamiania stash pop/applyprzed zatwierdzeniem, możesz strzelać git fsck --lost-found. To polecenie wykona iterację przez wiszące obiekty BLOB (rzeczywiste pliki dla tych, którzy nie znają terminologii git), które zostały zainscenizowane, ale nie zostały nigdzie zatwierdzone (dlatego zwisają), i umieści je w katalogu .git / lost-found / , gdzie można git showje zobaczyć i zobaczyć jeśli są to pliki, których szukasz.
Artem Hevorhian

Odpowiedzi:


69

Spróbuj użyć Jak odzyskać upuszczoną skrytkę w Git? żeby znaleźć ukryty przez ciebie zapas. Myślę, że zawsze są dwa zatwierdzenia dla skrytki, ponieważ zachowuje ona indeks i kopię roboczą (tak często zatwierdzanie indeksu będzie puste). Następnie git show, aby zobaczyć różnicę i użyć, patch -Raby je zastosować.


6
Wow, to zadziałało. Byłem w stanie znaleźć ukryte zatwierdzenia git fsck --no-reflog | awk '/dangling commit/ {print $3}'(z linku) i właśnie ręcznie znalazłem problem z tej różnicy. Dzięki!
nren

1
fsck wyświetla ogromną listę. Żmudne jest pokazywanie każdego SHA1. Jak Ty to robisz ?
meson10,

5
@ meson10: Niestety skrytki są przechowywane w rejestrze, co byłoby oczywistym sposobem (gdyby były prawdziwą gałęzią) na sprawdzenie historii wyskakujących skrytek. Pozwól też, że zasugeruję, że prośba o wsparcie + nie jest najlepszą strategią.
Ben Jackson,

2
Zajęło mi trochę kłopotów, żeby to zrobić poprawnie. Oto wynik mojej pracy git diff -p ${STACH_SHA1}~1 ${STASH_SHA1} | patch -R -p1:; Próbowałem git showzgodnie z sugestią, ale jego wyniki nie były dobre dla łatki; musiałem także zapewnić -p1opcję łatania w celu usunięcia elementu a/..i b/.., który git diffumieszcza przed plikami, w przeciwnym razie nie rozwiązałoby to ścieżek z katalogu głównego repozytorium. SUGESTIA: bądź ostrożny i poprowadź bałagan w osobnej gałęzi przed rozpoczęciem gry z patchem.
basilikode

@BenJackson W Twojej odpowiedzi „zawsze” oznacza oba stash popi stash pushwyzwoli zatwierdzenie, które zapisze zmiany w indeksie i katalogu roboczym, prawda?
Artem Hevorhian

36

Z 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

Pomogło mi to lepiej niż zaakceptowana odpowiedź w tym samym scenariuszu.


13
Należy pamiętać, że wiele rozwiązań wymagających wyszukiwania „WIP” opiera się na domyślnych wiadomościach ukrytych. Jeśli podasz skrytkom wyraźne wiadomości, mogą one nie zawierać PWT.
Ben Jackson

dzięki. Dodałem opcję --oneline do komendy log, aby poprawić czytelność.
basslo

Pomaga to tylko znaleźć SHA zatwierdzenia ukrytego. Ale jeśli zintegrowany z komentarzem @basilikode z zaakceptowanej odpowiedzi (git diff SHA ~ 1 SHA | patch -R), działa dobrze. Polecam użyć ścieżki - najpierw uruchom, aby sprawdzić.
Jarek C

3

Jeśli połączenie nie było zbyt skomplikowane, inną opcją byłoby:

  1. Przenieś wszystkie zmiany, w tym zmiany scalania, z powrotem do skrytki za pomocą „git stash”
  2. Uruchom scalanie ponownie i zatwierdź zmiany (bez zmian z upuszczonej skrytki)
  3. Uruchom „git stash pop”, który powinien zignorować wszystkie zmiany z poprzedniego scalania, ponieważ pliki są teraz identyczne.

Potem pozostały tylko zmiany ze skrytki, którą upuściłeś zbyt wcześnie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.