Czy to możliwe?
Tak jest!
git checkout -p [email protected]{0}
Gdzie można wymienić 0
w [email protected]{0}
z indeksem na zapas, który chcesz zastosować.
Użyj git stash list
i git show -p [email protected]{n}
, jeśli nie masz pewności, która n
to skrytka, którą chcesz zastosować.
Nie zapomnij o git stash drop [email protected]{n}
, gdy wiesz, że nie potrzebujesz już tego skrytka, ponieważ git checkout
oczywiście nie upuści za ciebie skrytki.
Dlaczego to działa?
Kluczem jest uświadomienie sobie, że skrytki są, w istocie, references do commits, podobnie jak znaczniki i gałęzie.
Rzeczywiście, są one przechowywane w .git/refs/stash
, jedna linia na mieszanie zapasów.
Ostrzeżenia
Jak @mgadda wymienione int komentarzach poniżej, git checkout -p
próbuje zastosować całą różnicę między popełnienia oraz bieżącym obszarze roboczym.
W przypadku zapas git, jeżeli zapas starasz się stosować zostało zrobione przed inną popełnienia, następnie git checkout -p [email protected]{n}
postara się interaktywnie zastosować wszystkie różnice między [email protected]{n}
a wszystko to rodzic popełnia i prąd przestrzeń robocza.
Na przykład, jeśli próbujesz zastosować zapas, który został zapisany „wielu commity temu” w bieżącym obszarze roboczym, git checkout -p [email protected]{n}
spróbuje zastosować nie tylko zmiany w zapasach właściwego, ale także spróbować revert wszystkie zmiany, które nastąpiły między zatwierdzeniem, na którym opiera się przechowalnia, a bieżącym zatwierdzeniem.
Podobnie, jeśli próbujesz zastosować skrytkę "z przyszłości", tj. Do gałęzi, która jest liczbą zatwierdzeń przed zatwierdzeniem, na którym bazuje, wtedy git checkout -p [email protected]{n}
spróbuje również zastosować wszystkie inne zmiany, które nastąpiły między bieżącym zatwierdzeniem a zatwierdzeniem z przyszłości, poza zmianami ze samej skrytki.
(W przypadku, gdy zastanawiasz się, git checkout -p [email protected]{n}
zapas z równoległego oddziału spróbuje przywrócić wszystkie zmiany między obecny popełnić i oryginalny punkt rozgałęzienia i zastosować również wszelkie zmiany pomiędzy punktem rozgałęzienia, a drugi oddział, oprócz zmiany w skrytce).
Istnieje kilka obejścia, żaden z nich idealne są idealne dla każdej sytuacji:
być bardzo ostrożnym z łatami akceptację kiedy robisz git checkout -p [email protected]{n}
Wykonaj git stash pop
, następnie git stash
ponownie przed wykonaniem git checkout -p ...
. Ale jeśli chcesz zrobić częściowe zastosowanie swojej skórki, aby uniknąć konfliktów, to tak naprawdę nie pomoże.
Jeśli masz graficznego narzędzia diff obsługiwanego przez git (jak meld), można użyć git difftool
i „lewo” stosuje wszystkie zmiany jesteś zainteresowany.
Istnieje zastrzeżenie, o którym trzeba wspomnieć: ponieważ skrytki są tylko zatwierdzeniami, oznacza to, że mają także nadrzędne zatwierdzenia, które nie gwarantują tego samego nadrzędnego zatwierdzenia, co ten, do którego chcesz interaktywnie zastosować zmiany. Zasada: jeśli ukryłeś się przed jakimś innym zatwierdzeniem niż aktualnie zatwierdzony commit, ta technika nie zrobi tego, czego oczekujesz. Obejście: zastosuj cały zestaw zmian ze swojego skrytka (z git skrytką pop), a następnie ponownie przechowuj (git ukryj). Teraz możesz git -out zgodnie z życzeniem. – mgadda
@mgadda, dziękuję. Dodałem sekcję "zastrzeżeń". – LeoRochael