Mam małą łatkę zapisaną w mojej skrytce git. Zastosowałem go do mojej kopii roboczej za pomocą git stash apply
. Teraz chciałbym wycofać się z tych zmian, odwrotnie stosując łatkę (coś w rodzaju tego git revert
, co by zrobił, gdyby nie skrytka).
Czy ktoś wie jak to zrobić?
Wyjaśnienie: Istnieją inne zmiany w mojej kopii roboczej. Mój konkretny przypadek jest trudny do opisania, ale możesz sobie wyobrazić jakiś debugujący lub eksperymentalny kod, który jest w skrytce. Teraz jest mieszany w mojej kopii roboczej z kilkoma innymi zmianami i chciałbym zobaczyć efekt ze zmianami ukrytymi i bez nich.
Nie wygląda na to, że skrytka obsługuje to obecnie, ale git stash apply --reverse
byłaby to miła funkcja.
Odpowiedzi:
Według strony podręcznika git-stash: „Skrytka jest reprezentowana jako zatwierdzenie, którego drzewo rejestruje stan katalogu roboczego, a jej pierwszy element nadrzędny jest zatwierdzeniem w
HEAD
momencie utworzenia skrytki” igit stash show -p
daje nam „zmiany zapisane w ukryj jako różnicę między stanem ukrytym a jego pierwotnym elementem nadrzędnym.Aby zachować pozostałe zmiany w nienaruszonym stanie, wykonaj
git stash show -p | patch --reverse
następujące czynności:Edytować:
Lekkim ulepszeniem tego jest użycie
git apply
zamiast łatki:Możesz także użyć
git apply -R
jako skrótu dogit apply --reverse
.Ostatnio bardzo mi się to przydaje ...
źródło
git apply -R
jest poprawą, przynajmniej dla mnie na moim oknie z git bash, ponieważpatch --reverse
miał problemy z lokalizacją pliku do łatania (brak prawdziwej wskazówki, dlaczego alternatywa działała). +1 i dobre wyjaśnienie--index
tak jak tengit stash show -p | git apply --reverse --index
. Ponieważ nie trzeba już dodawać do indeksu zmian cofniętych z powrotem.git stash show -p | git apply -R -v
z komunikatem:Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1
. Czy wiesz, co może być nie tak?git stash
[save]
pobiera stan katalogu roboczego i stan indeksu i ukrywa je, ustawiając indeks i obszar roboczy naHEAD
wersję.git stash apply
przywraca te zmiany, więcgit reset --hard
usunęłoby je ponownie.git stash pop
przywraca te zmiany i usuwa najbardziej ukrytą zmianę, więc w takimgit stash [save]
przypadku powróciłby do poprzedniego stanu (przed popem).źródło
usunie wszelkie zmiany niezwiązane z zatwierdzeniem.
źródło
Strona podręcznika git w wersji V1 zawierała odniesienie do cofania stosowania skrytki. Fragment znajduje się poniżej.
Nowsza strona git man V2 nie zawiera żadnych odniesień do cofania stosowania skrytki, ale poniższe działania nadal działają dobrze
Cofanie zastosowania skrytki W niektórych scenariuszach przypadków użycia możesz chcieć zastosować zmiany ukryte, wykonać trochę pracy, ale potem cofnąć stosowanie tych zmian, które pierwotnie pochodziły ze skrytki. Git nie udostępnia polecenia cofnięcia zastosowania skrytki, ale można osiągnąć ten efekt, po prostu pobierając łatkę związaną ze skrytką i stosując ją w odwrotnej kolejności:
Ponownie, jeśli nie określisz skrytki, Git zakłada najnowszą skrytkę:
Możesz utworzyć alias i skutecznie dodać do swojego Git polecenie ukrywania-niestosowania. Na przykład:
źródło
To już dawno minęło, ale jeśli poprawnie interpretuję problem, znalazłem proste rozwiązanie, zauważ, że to wyjaśnienie w mojej własnej terminologii:
git stash [save]
zapisze bieżące zmiany i ustawi swój aktualny oddział na „czysty stan”git stash list
daje coś takiego:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
ustawi dotychczasową gałąź jak poprzedniostash [save]
git checkout .
Ustawi obecny oddział jak późniejstash [save]
Kod zapisany w skrytce nie zostanie utracony, można go znaleźć
git apply stash@{0}
ponownie.W każdym razie to zadziałało dla mnie!
źródło
git stash apply --reverse
najpierw złożyłem aplikację, a potem po prostu wróciłem do tegogit stash apply stash@{x}
, o czym wspomniałeś. Pracowałem bez problemów.Oprócz tego, co wspomnieli inni, najpierw najłatwiej jest to zrobić
a następnie sprawdź wszystkie zmiany lokalne
źródło
Oprócz odpowiedzi @Greg Bacon, w przypadku gdy pliki binarne zostały dodane do indeksu i były częścią skrytki za pomocą
może spowodować
Dodanie
--binary
rozwiązuje problem, ale niestety jeszcze nie dowiedzieliśmy się, dlaczego.źródło
Jest to dodatek do powyższych odpowiedzi, ale dodaje wyszukiwanie skrytki git na podstawie wiadomości, ponieważ numer skrytki może się zmienić po zapisaniu nowych skrytek. Napisałem kilka funkcji bash:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"
źródło
Możesz podążać za obrazem, który udostępniłem, aby odblokować, jeśli przypadkowo stuknąłeś ukrywanie.
źródło