Odpowiedzi:
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 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:
git add -A
git stash apply
a następnie (opcjonalnie):
git reset
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.
Albo wyczyść katalog roboczy za pomocą git reset, zatwierdź zmiany lub, jeśli chcesz zachować bieżące zmiany, spróbuj:
$ git stash save "opis bieżących zmian" $ git stash pop stash @ {1}
Spowoduje to ukrycie bieżących zmian, a następnie zdejmie drugą skrytkę ze stosu.
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).
Ż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
Uważam również, że rozwiązanie Mathiasa Leppicha działa świetnie, więc dodałem dla niego alias do mojego globalnego .gitconfig
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Teraz mogę po prostu pisać
git apply-stash-to-dirty-working-tree
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).
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żesz git stash pop
i zastosować zapisane zmiany, bez problemu.
Masz pliki, które zostały zmodyfikowane, ale niezatwierdzone. Zarówno:
git reset --hard HEAD (to bring everything back to HEAD)
lub, jeśli chcesz zapisać zmiany:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
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.
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
i reset --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
i git merge tempbranchname
. Z http://git-scm.com/book/en/Git-Tools-Stashing :
Jeśli chcesz łatwiejszego sposobu ponownego przetestowania ukrytych zmian, możesz uruchomić git stash branch, który tworzy dla ciebie nową gałąź, sprawdza zatwierdzenie, na którym byłeś, kiedy przechowywałeś swoją pracę, ponownie stosuje tam twoją pracę, a następnie upuszcza stash, jeśli się powiedzie
git stash show -p | git apply
inny niżgit stash apply
?