2011-07-01 6 views
151

Przechwyciłem kilka lokalnych zmian przed wykonaniem skomplikowanego scalenia, dokonałem scalenia, a potem głupio zapomniałem zatwierdzić przed uruchomieniem git stash pop. Pop powodował pewne problemy (złe wywołania metod w dużym kodzie źródłowym), które okazały się 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 jest to lekcja, aby popełnić więcej.Cofanie przypadkowego ukrywania git pop

Moje pytanie: czy można cofnąć pamięć podręczną bez cofania scalania?

+2

Nie wolno ci mieć "git stash popu" bez uprzedniego popełnienia. Co zrobiłeś, aby to osiągnąć? –

+0

Nie jestem szczery (to było wczoraj). Scalenie nie zostało popełnione na własną rękę, ponieważ były konflikty. Po jakimś czasie udało mi się uruchomić pop. – nren

+0

Zrobiłem to po prostu wiem, używając git w wersji 1.7.9.msysgit.0. Miałem nieprzydzielone pliki, a skrytka po prostu scalała wszystko. – PandaWood

Odpowiedz

58

Spróbuj użyć How to recover a dropped stash in Git?, aby znaleźć ukryty schowek. Myślę, że zawsze istnieją dwa zatwierdzenia dla zasobu, ponieważ zachowuje on indeks i kopię roboczą (tak często zatwierdzenie indeksu będzie puste). Następnie git show je zobaczyć diff i użyć patch -R, aby anulować je.

+6

Wow, który działał. Byłem w stanie znaleźć skrytki z 'git fsck --no-reflog | awk '/ dangling commit/{print $ 3}' '(z linku), a ja po prostu odnalazłem problem z tego porównania. Dzięki! – nren

+0

fsck wyświetla ogromną listę. Jego żmudne git pokazują każdy SHA1. Jak Ty to robisz ? – meson10

+3

@ meson10: Niestety skrytki są przechowywane w reflogu, co byłoby oczywistym sposobem (jeśli byłyby prawdziwą gałęzią), aby spojrzeć na historię pop-upów. Pozwolę sobie również zasugerować, że prośba o pomoc + nie jest najlepszą strategią. –

28

Od 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 

To pomogło mi lepiej niż zaakceptowanej odpowiedzi z tego samego scenariusza.

+8

Należy pamiętać, że wiele rozwiązań związanych z wyszukiwaniem "WIP" opiera się na domyślnych wiadomościach. Jeśli podasz swoje wiadomości jawne, mogą nie zawierać WIP. –

+0

dzięki. Dodałem opcję --oneline do polecenia dziennika, aby poprawić czytelność. – basslo

0

nie Jeśli seryjnej było zbyt skomplikowane innym rozwiązaniem byłoby:

  1. Przenieś wszystkie zmiany w tym scalić zmiany z powrotem schować za pomocą „git zapas”
  2. Run scalanie ponownie i swoje zmiany (bez zmian ze zrzuconej pamięci)
  3. Uruchom "git skrytkę pop", która powinna zignorować wszystkie zmiany z poprzedniego scalenia, ponieważ pliki są teraz identyczne.

Po tym czasie pozostaną tylko zmiany ze skrytki, którą zbyt wcześnie zrzuciłeś.