Łatwa odpowiedź na proste pytanie brzmi git stash apply
Po prostu sprawdź gałąź, w której chcesz wprowadzić zmiany, a następnie git stash apply
. Następnie użyj, git diff
aby zobaczyć wynik.
Po skończysz ze zmiany-z apply
dobrym wyglądem i masz pewność, że nie trzeba zapas każdy więcej- następnie użyć git stash drop
, aby pozbyć się go.
Zawsze sugeruję używanie git stash apply
zamiast git stash pop
. Różnica polega na tym, że apply
pozostawia skrytkę w celu łatwego ponownego spróbowania apply
, lub w celu patrzenia itp. Jeśli pop
jest w stanie wyodrębnić skrytkę, natychmiast drop
ją również zrobi , a jeśli nagle uświadomisz sobie, że chcesz ją gdzieś wyodrębnić w innym (w innej gałęzi), z --index
, lub z innymi, to nie jest takie proste. Jeśli tak apply
, możesz wybrać, kiedy drop
.
To wszystko jest dość niewielkie w ten czy inny sposób, a dla nowicjusza, powinno być mniej więcej tak samo. (I możesz pominąć resztę tego!)
Co jeśli robisz bardziej zaawansowane lub bardziej skomplikowane rzeczy?
Istnieją co najmniej trzy lub cztery różne „sposoby używania skrytki git”. Powyższe dotyczy „sposobu 1”, „łatwego sposobu”:
Zacząłeś od czystej gałęzi, pracowałeś nad pewnymi zmianami, a potem zdałeś sobie sprawę, że robisz je w niewłaściwej gałęzi. Chcesz tylko wprowadzić zmiany, które już masz, i przenieść je do innej gałęzi.
Jest to łatwy przypadek opisany powyżej. Uruchom git stash save
(lub zwykły git stash
, to samo). Sprawdź drugi oddział i skorzystaj z niego git stash apply
. To powoduje, że git łączy się z twoimi wcześniejszymi zmianami, używając raczej potężnego mechanizmu scalania git. Sprawdź wyniki dokładnie (za pomocą git diff
), aby zobaczyć, czy ci się podobają, a jeśli tak, użyj git stash drop
upuszczenia skrytki. Jesteś skończony!
Zacząłeś pewne zmiany i ukryłeś je. Następnie przeniosłeś się do innej gałęzi i zacząłeś więcej zmian, zapominając, że masz te ukryte.
Teraz chcesz zachować, a nawet przenieść te zmiany, i zastosować również swoją skrytkę.
Możesz w rzeczywistości git stash save
ponownie, ponieważ git stash
tworzy „stos” zmian. Jeśli to zrobisz, masz dwie skrytki, jedną właśnie nazwaną stash
- ale możesz także pisać stash@{0}
- i jedną pisownię stash@{1}
. Użyj git stash list
(w dowolnym momencie), aby zobaczyć je wszystkie. Najnowszy ma zawsze najniższy numer. Kiedy Ty git stash drop
upuszczasz najnowszy, a ten, który był, stash@{1}
przenosi się na szczyt stosu. Jeśli miał nawet więcej, ten, który był stash@{2}
stanie stash@{1}
, i tak dalej.
Możesz, apply
a następnie drop
także konkretną skrytkę: git stash apply stash@{2}
i tak dalej. Porzucenie określonej skrytki przenumeruje tylko te o wyższych numerach. Ponownie, ten bez numeru jest również stash@{0}
.
Jeśli zgromadzisz dużo skrytek, może stać się dość nieuporządkowany (czy był to schowek, którego chciałem, stash@{7}
czy był stash@{4}
? Czekaj, właśnie nacisnąłem inny, teraz są 8 i 5?). Osobiście wolę przenieść te zmiany do nowej gałęzi, ponieważ gałęzie mają nazwy i cleanup-attempt-in-December
oznaczają dla mnie znacznie więcej stash@{12}
. ( git stash
Polecenie przyjmuje opcjonalną wiadomość zapisu, a te mogą pomóc, ale jakoś wszystkie moje skrytki właśnie się skończyły WIP on branch
).
(Bardzo zaawansowane) Użyłeś git stash save -p
lub dokładnie git add
i / lub git rm
-eded określone bity twojego kodu przed uruchomieniem git stash save
. Miałeś jedną wersję w ukrytym indeksie / obszarze pomostowym, a drugą (inną) wersję w działającym drzewie. Chcesz to wszystko zachować. Więc teraz używasz git stash apply --index
, a to czasami kończy się niepowodzeniem z:
Conflicts in index. Try without --index.
Używasz git stash save --keep-index
, aby przetestować „co zostanie popełnione”. Ten jest poza zakresem tej odpowiedzi; zamiast tego zobacz inną odpowiedź StackOverflow .
W przypadku skomplikowanych przypadków zalecam najpierw rozpocząć pracę w „czystym” katalogu roboczym, wprowadzając wszelkie zmiany, które teraz wprowadzasz (jeśli chcesz, w nowym oddziale). W ten sposób „gdzieś”, w którym je stosujesz, nie ma w tym nic więcej, a będziesz po prostu próbował ukryć zmiany:
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
Teraz jesteś na „czystym” punkcie wyjścia. A może wygląda to tak:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create new branch for "apply"
git stash apply # apply stashed changes; see below about --index
Najważniejszą rzeczą do zapamiętania jest to, że „skrytka” to zatwierdzenie, to tylko „zabawne / dziwne” zatwierdzenie, które nie jest „na gałęzi”. Do apply
wygląda praca na co commit zmienione i próbuje powtórzyć go gdziekolwiek jesteś teraz. Skrytka nadal będzie tam ( apply
utrzymuje ją w pobliżu), więc możesz na nią spojrzeć więcej lub zdecydować, że to niewłaściwe miejsce apply
i spróbować ponownie inaczej lub cokolwiek innego.
Za każdym razem, gdy masz skrytkę, możesz użyć jej, git stash show -p
aby zobaczyć uproszczoną wersję tego, co jest w skrytce. (Ta uproszczona wersja patrzy tylko na zmiany „ostatecznego drzewa roboczego”, a nie na zapisane zmiany indeksu, które --index
przywracają osobno.) Polecenie „ git stash apply
bez” --index
po prostu próbuje teraz dokonać tych samych zmian w katalogu roboczym.
Jest to prawdą, nawet jeśli masz już jakieś zmiany. apply
Komenda chętnie stosują zapas do zmodyfikowanego katalogu roboczym (lub przynajmniej, aby spróbować go zastosować). Możesz na przykład zrobić to:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
Możesz tutaj wybrać polecenie „zastosuj”, wybierając poszczególne skrytki do zastosowania w określonej kolejności. Zauważ jednak, że za każdym razem, gdy wykonujesz „scalanie git” i jak ostrzega dokumentacja scalania:
Odradzanie uruchamiania git z nietrywialnymi niezatwierdzonymi zmianami jest odradzane: chociaż jest to możliwe, może pozostawić cię w stanie, który trudno jest wycofać się w przypadku konfliktu.
Jeśli zaczynasz od czystego katalogu i wykonujesz tylko kilka git apply
operacji, łatwo jest się wycofać: użyj, git reset --hard
aby wrócić do czystego katalogu i zmienić swoje apply
operacje. (Dlatego właśnie polecam zacząć od czystego katalogu roboczego, w tych skomplikowanych przypadkach).
Co z najgorszym możliwym przypadkiem?
Załóżmy, że robisz wiele zaawansowanych rzeczy Git i zrobiłeś skrytkę i chcesz git stash apply --index
, ale nie możesz już zastosować zapisanej skrytki --index
, ponieważ gałąź odbiegała zbytnio od czasu jej zapisania.
Po to git stash branch
jest.
Jeśli ty:
- sprawdzeniu dokładnego popełnić byłaś kiedy zrobiłeś oryginału
stash
, a następnie
- utworzyć nowy oddział i na koniec
git stash apply --index
próba ponownego utworzenia zmiany na pewno będą działać. To właśnie robi. (A następnie upuszcza skrytkę, ponieważ została pomyślnie zastosowana).git stash branch newbranch
Kilka ostatnich słów na temat --index
(co to do cholery jest?)
To, co --index
robi, jest proste do wyjaśnienia, ale nieco skomplikowane wewnętrznie:
- Kiedy wprowadzasz zmiany, musisz je
git add
(lub „wystawić”) przed wprowadzeniem commit
.
- Tak więc, kiedy biegł
git stash
, to może być edytowany zarówno pliki foo
i zorg
, ale tylko jeden z tych inscenizacji.
- Więc kiedy pytasz, aby uzyskać z powrotem stash, to może być miło, gdyby to
git add
s add
rzeczy Ed i robi nie git add
nieokreślone dodane rzeczy. Oznacza to, że jeśli add
edytowałeś, foo
ale nie zorg
wróciłeś, zanim to zrobiłeś stash
, może być miło mieć taką samą konfigurację. To, co zostało zainscenizowane, powinno zostać ponownie zainscenizowane; to, co zostało zmodyfikowane, ale nie ustawione, powinno być ponownie zmodyfikowane, ale nie ustawione.
--index
Flagę apply
próbuje ustawić rzeczy ten sposób. Jeśli twoje drzewo robocze jest czyste, zwykle działa to po prostu. Jeśli jednak w twoim drzewie roboczym są już zainstalowane elementy add
, możesz zobaczyć, jak mogą występować tutaj problemy. Jeśli pominąć --index
The apply
operacja nie próbuje zachować cały wystawił / Unstaged konfigurację. Zamiast tego po prostu wywołuje maszynę scalającą git, używając zatwierdzenia drzewa roboczego w „stash bag” . Jeśli nie zależy ci na zachowaniu etapowym / niestacjonarnym, pominięcie --index
go znacznie ułatwia git stash apply
zrobienie tego.