Próbuję zastosować zmiany, które zapisałem wcześniej git stash pop
i otrzymuję komunikat:
Cannot apply to a dirty working tree, please stage your changes
Jakieś sugestie, jak sobie z tym poradzić?
Kiedy muszę zastosować ukryte zmiany w brudnej kopii roboczej, np. Wyjąć więcej niż jeden zestaw zmian ze schowka, używam:
$ git stash show -p | git apply -3 && git stash drop
W zasadzie to
Zastanawiam się, dlaczego nie ma opcji -f
(wymuszenia), dla git stash pop
której powinno się dokładnie zachowywać jak powyższy jednolinijkowy.
W międzyczasie możesz dodać ten jednolinijkowy alias jako alias git:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Podziękowania dla @SamHasler za wskazanie -3
parametru, który pozwala rozwiązywać konflikty bezpośrednio przez 3-way merge.
git stash show -p | git apply
inny niżgit stash apply
?git stash apply
nie zastosuje zachowanych zmian, jeśli masz brudną kopię roboczą. Możesz więc zobaczyć,git stash show -p | git apply
że obowiązuje jakiś wymuszony skryt.error: <file> does not match index
każdym zmodyfikowanym plikiem. Jednak inne rozwiązanie zadziałało.Robię to w ten sposób:
a następnie (opcjonalnie):
źródło
git add -u
, co jest jak-A
z wyjątkiem tego, że nie dodaje nieśledzonych plików.Możesz to zrobić bez konieczności przechowywania bieżących zmian, eksportując żądaną skrytkę jako plik poprawki i ręcznie ją stosując.
Załóżmy na przykład, że chcesz zastosować stash @ {0} do brudnego drzewa:
Eksportuj magazyn @ {0} jako poprawkę:
git stash show -p stash @ {0}> Stash0.patch
Ręcznie zastosuj zmiany:
git zastosuj Stash0.patch
Jeśli drugi krok się nie powiedzie, będziesz musiał wyedytować plik Stash0.patch, aby naprawić wszelkie błędy, a następnie ponownie spróbować zastosować git.
źródło
Albo wyczyść katalog roboczy za pomocą git reset, zatwierdź zmiany lub, jeśli chcesz zachować bieżące zmiany, spróbuj:
Spowoduje to ukrycie bieżących zmian, a następnie zdejmie drugą skrytkę ze stosu.
źródło
Rozwiązanie Mathiasa jest zdecydowanie najbliższe git stash pop --force (i naprawdę, chodźmy do twórców Git, pobierzmy już tę opcję!)
Jeśli jednak chcesz zrobić to samo, używając tylko poleceń git, możesz:
Innymi słowy, dokonaj zatwierdzenia (którego nigdy nie będziemy pchać) aktualnych zmian. Teraz, gdy twoje miejsce pracy jest czyste, wyrzuć swój schowek. Teraz zatwierdź zmiany w skrytce jako poprawkę do twojego poprzedniego zatwierdzenia. Uczyniwszy to, masz teraz oba zestawy zmian połączone w jednym zatwierdzeniu („Fixme”); po prostu zresetuj (- miękkie NIE - twarde, więc nic nie jest stracone) twój checkout do "jednego przed tym zatwierdzeniem" i teraz masz oba zestawy zmian, całkowicie niezatwierdzone.
** EDYTUJ * *
Właśnie zdałem sobie sprawę, że to jeszcze łatwiejsze; możesz całkowicie pominąć krok 3, więc ...
(Zatwierdź bieżące zmiany, usuń ukryte zmiany, zresetuj pierwsze zatwierdzenie, aby uzyskać połączenie obu zestawów zmian w stanie niezatwierdzonym).
źródło
Żadna z tych odpowiedzi nie działa, jeśli znajdziesz się w takiej sytuacji, jak ja dzisiaj. Bez względu na to, ile
git reset --hard
zrobiłem, nic mnie to nie dało. Moja odpowiedź (w żadnym wypadku nie była oficjalna):git reflog --all
źródło
Uważam również, że rozwiązanie Mathiasa Leppicha działa świetnie, więc dodałem dla niego alias do mojego globalnego .gitconfig
Teraz mogę po prostu pisać
co działa świetnie dla mnie.
(Twój przebieg może się różnić w przypadku tej długiej nazwy aliasu. Ale lubię dawkę szczegółowości, jeśli chodzi o zakończenie bash).
źródło
Możesz przyłożyć skrytkę do „brudnego” drzewa, wykonując a,
git add
aby przygotować zmiany, które wprowadziłeś, a tym samym oczyścić drzewo. Wtedy możeszgit stash pop
i zastosować zapisane zmiany, bez problemu.źródło
Masz pliki, które zostały zmodyfikowane, ale niezatwierdzone. Zarówno:
lub, jeśli chcesz zapisać zmiany:
źródło
Miałem ten sam problem, ale git nie miał żadnych zmienionych plików. Okazało się, że miałem plik index.lock, który leżał w pobliżu. Usunięcie go rozwiązało problem.
źródło
Większość z nich nie działała; z jakiegoś powodu zawsze myśli, że mam lokalne zmiany w pliku. Nie mogę założyć skrytki, łaty się nie zastosują
checkout
ireset --hard
zawodzą. Ostatecznie zadziałało zapisanie zapasu jako gałęzi za pomocągit stash branch tempbranchname
, a następnie wykonanie normalnego scalania gałęzi:git checkout master
igit merge tempbranchname
. Z http://git-scm.com/book/en/Git-Tools-Stashing :źródło