Cofnij git stash pop, co powoduje konflikt scalania

518

Zacząłem wprowadzać zmiany w bazie kodu, nie zdając sobie sprawy, że zajmowałem się starą gałęzią tematów. Aby je przenieść, chciałem je schować, a następnie zastosować w nowym oddziale master. Zwykłem git stash popprzenosić zmiany w toku do tej nowej gałęzi, zapominając, że nie utworzyłem nowych zmian w master przed utworzeniem nowej gałęzi. Spowodowało to wiele konfliktów scalania i utratę czystych zapasów moich zmian (ponieważ korzystałem z popu).

Po prawidłowym odtworzeniu nowego oddziału, jak mogę odzyskać ukryte zmiany, aby je odpowiednio zastosować?

acjay
źródło

Odpowiedzi:

654

Jak się okazuje, Git jest wystarczająco sprytny, aby nie upuścić skrytki, jeśli nie zastosuje się czysto. Udało mi się przejść do pożądanego stanu, wykonując następujące czynności:

  1. Aby wycofać scenę z konfliktów scalania: git reset HEAD .(zwróć uwagę na kropkę końcową)
  2. Aby zapisać konflikt scalenia (na wszelki wypadek): git stash
  3. Aby wrócić do mistrza: git checkout master
  4. Aby pobrać najnowsze zmiany: git fetch upstream; git merge upstream/master
  5. Aby poprawić mój nowy oddział: git checkout new-branch; git rebase master
  6. Aby zastosować prawidłowe zmiany ukryte (teraz 2. na stosie): git stash apply stash@{1}
acjay
źródło
14
Wspaniale dzięki! # 6 to naprawdę odpowiedź, której szukałem. Można dodać git stash dropjako ostatni krok, aby pozbyć się niechcianej skrytki z # 2.
austinmarton
1
# 2 nie będzie działać, jeśli istnieją nie połączone ścieżki, zamiast tego wyświetli opisany tutaj błąd: stackoverflow.com/questions/5483213/...
Étienne
5
Nie do końca prawda - Git zachowa skrytkę na liście skrytek, jeśli nie zastosuje się czysto. Zapoznaj się z tymi dokumentami na temat git stash pop: „Zastosowanie stanu może zakończyć się niepowodzeniem w przypadku konfliktów; w tym przypadku nie jest usuwane z listy ukrytych. Musisz rozwiązać konflikty ręcznie, a następnie wywołać git stash dropręcznie”. ( git-scm.com/docs/git-stash )
Carolyn Conway,
4
Dziwne, jak ta odpowiedź i pytanie są publikowane dokładnie w tej samej minucie
zadzwoń do mnie
13
@ call-me Myślę, że ludzie powinni to robić częściej! Zauważ, że formularz „Zadaj pytanie” ma pole wyboru, które pozwala odpowiedzieć na własne pytanie w tej samej formie :). Zdarza mi się to czasami, gdy jestem w trakcie tworzenia pytania, które mnie dręczy, ale próbując dostroić pytanie, aby było dobre dla StackOverflow, w końcu zastanawiam się nad rozwiązaniem. To było jakiś czas temu, więc nie pamiętam, czy tak było w tym przypadku, ale domyślam się, że tak się stało.
acjay
340

Na szczęście git stash popma nie zmienić zapas w przypadku konfliktu!

Nic więc się martwić, wystarczy wyczyścić kod i spróbować ponownie.

Powiedzmy, że twoja baza kodów była wcześniej czysta, możesz wrócić do tego stanu za pomocą: git checkout -f
Następnie zrób rzeczy, o których zapomniałeś, np. git merge missing-branch
Po tym po prostu strzel git stash popponownie, a otrzymasz ten sam zapas, który wcześniej był w konflikcie.

Uwaga: skrytka jest bezpieczna, jednak niezatwierdzone zmiany w katalogu roboczym nie są. Mogą się zepsuć.

flori
źródło
16
Rozumiem, że możesz po prostu oczyścić i pop ponownie, ale nie możesz tego cofnąć . Jeśli pop zmiesza się z innymi niezaangażowanymi zmianami, musisz wyczyścić ręcznie.
haridsv
To jest bardzo proste rozwiązanie i działało świetnie dla mnie. Zakłada się, że możesz cofnąć wszystko, co zmieniło się lokalnie (nie było żadnych zmian przed / po wyskakowaniu skrytki), co moim zdaniem działa w większości sytuacji. Jeśli trzeba było zapisać dodatkowe zmiany, które nastąpiły przed uświadomieniem sobie, że był to problem, w większości przypadków powinieneś być w stanie zatwierdzić te pliki przed wymuszeniem realizacji transakcji.
Project707
Tak nie było w moim przypadku. Nazwałem git stash popto próbą automatycznego scalenia, konfliktu i zachowałem.
Trevor Hickey,
1
@TrevorHickey Celem tej odpowiedzi było to, że skrytka pozostaje niezmieniona w przypadku konfliktu, do którego możesz dzwonić git stash poptak często, jak potrzebujesz, aż zakończy się bez konfliktu. Tak więc po konflikcie tak, katalog roboczy jest w bałaganie, jednak możesz go wyczyścić i git stash popponownie zadzwonić .
flori
5
to polecenie, aby cofnąć zastosowanie ostatniego skrytki, jest bardzo przydatne git checkout -f:!
Lefi Tarik
16

Instrukcje tutaj są trochę skomplikowane, więc zamierzam zaoferować coś prostszego:

  1. git reset HEAD --hard Porzuć wszystkie zmiany w bieżącym oddziale

  2. ... Wykonuj prace pośredniczące, jeśli to konieczne

  3. git stash pop Ponownie włóż schowek ponownie w późniejszym terminie, gdy będziesz gotowy

anon58192932
źródło
vimeo.com/79954057
faintsignal
8
git checkout -f

musi działać, jeśli twój poprzedni stan jest czysty.

Allahbakash.G
źródło