Odpowiedzi:
Zobacz najnowszą skrytkę:
git stash show -p
Zobacz dowolną skrytkę:
git stash show -p stash@{1}
Z git stash
podręczników:
Domyślnie polecenie pokazuje diffstat, ale akceptuje dowolny format znany z git diff (np. Git stash show -p stash @ {1}, aby wyświetlić drugi najnowszy skrytka w formie łatki).
stash@{0}
jest domyślny; potrzebujesz tylko argumentu, jeśli chcesz spojrzeć na poprzednie skrytki.
{0}
.
-p
skrót
Aby zobaczyć najnowszą skrytkę:
git stash show -p
Aby zobaczyć dowolną skrytkę:
git stash show -p stash@{1}
Ponadto używam git diff do porównywania skrytki z dowolną gałęzią.
Możesz użyć:
git diff stash@{0} master
Aby zobaczyć wszystkie zmiany w porównaniu do wzorca gałęzi.
Lub możesz użyć:
git diff --name-only stash@{0} master
Aby łatwo znaleźć tylko zmienione nazwy plików.
git diff stash@{0} master
, otrzymasz różnicę skrytki względem bieżącego wzorca (która obejmuje pracę wykonaną na skrypcie po skrytce został utworzony), a nie pliki / linie, które skrytka zmieniłaby, o to właśnie chodzi.
git difftool --tool=... stash@{0} HEAD
git diff stash@{0}^ stash@{0}
git diff stash@{0} master -- filename
aby uzyskać zmiany w określonym pliku.
Jeśli w międzyczasie zmieniła się gałąź, na której oparte są twoje ukryte zmiany, to polecenie może być przydatne:
git diff stash@{0}^!
Porównuje skrytkę z zatwierdzeniem, na którym jest oparta.
~/.gitconfig
:laststash = diff stash@{0}^!
git difftool stash^!
dla różnicy ostatniego skrytki przeciwko zatwierdzeniu, na której była oparta, git difftool stash HEAD
dla różnicy ostatniej skrytki względem bieżącego zatwierdzenia (skrytka @ {n} dla wcześniejszych
Jeśli twoje drzewo robocze jest brudne , możesz porównać je do skrytki, najpierw zatwierdzając brudne drzewo robocze, a następnie porównując je ze skrytką. Następnie możesz cofnąć zatwierdzenie za pomocą brudnego drzewa roboczego (ponieważ możesz nie chcieć mieć tego brudnego zatwierdzenia w swoim dzienniku zatwierdzeń).
Możesz również zastosować poniższe podejście, aby porównać ze sobą dwie skrytki (w takim przypadku najpierw zrywasz jedną ze skrytek).
Zatwierdź swoje brudne drzewo robocze:
git add .
git commit -m "Dirty commit"
Zróżnicuj skrytkę tym zatwierdzeniem
git diff HEAD stash@{0}
Następnie możesz cofnąć zatwierdzenie i umieścić go z powrotem w działającym katalogu:
git reset --soft HEAD~1
git reset .
Teraz różnicujesz brudne pracujące drzewo za pomocą skrytki i wróciłeś do miejsca, w którym byłeś początkowo.
git stash show -l
. Czy różni ostatnią skrytkę od działającej (brudnej) kopii? Jak korzystać z niego bez uzyskiwania error: switch l requires a value
?
git stash show -l
. Jeśli chodzi o to, dlaczego to nie działa, mogę tylko zgadywać, że korzystasz ze starszej wersji git? Korzystam z git v2.20.1 i działa bezbłędnie bez błędów.
@ Magne za odpowiedź jest jedynym (bardzo późno) DATA że odpowiedzi najbardziej elastyczne / użyteczne interpretacja pytanie, ale jego rzetelnego trochę bardziej skomplikowane niż to konieczne. Zamiast popełniać i resetować, po prostu schowaj kopię roboczą, porównaj, a następnie odblokuj.
git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop
To pokazuje różnice między górą stosu skrytki a folderem roboczym, tymczasowo powodując, że zmiany folderu roboczego stają się górą stosu skrytki (skrytka @ {0}), przesuwając oryginalny góra z góry na dół (skrytka @ {1}) ), a następnie porównanie przy użyciu oryginalnego blatu w pozycji „nowego zestawu”, aby zobaczyć zmiany, które wynikałyby z zastosowania go na bieżącej pracy.
„Ale co jeśli nie mam żadnej bieżącej pracy?” Jesteś w normalnym nudnym przypadku. Wystarczy użyć odpowiedzi @ Amber
git stash show
lub odpowiedź @ czerasz
git diff stash@{0}
lub przyznaj, że ukrywanie i odpychanie jest i tak szybkie i łatwe, po prostu rozpuść zmiany i sprawdź je. Jeśli nie chcesz ich w tej chwili wyrzucić (zmiany w bieżącym indeksie / folderze roboczym). W całości to
git stash apply
git diff
git reset
git checkout
git stash save -u
Działa to dla mnie w wersji git 1.8.5.2:
git diff stash HEAD
git stash apply
.
Jeśli masz narzędzia do porównywania (np. Bez porównania)
git difftool stash HEAD
git stash apply
.
HEAD
. Mógłbym zmodyfikować odpowiedź @ yerlilbilgin, aby usunąć HEAD, ale myślę, że każdy, kto korzysta z git, może to rozszyfrować, a ja przedłużając odpowiedź, uczynię ją mniej czytelną. Bez winy @yerlibilgin.
Jednym ze sposobów na zrobienie tego bez przenoszenia niczego jest skorzystanie z faktu, że patch
potrafi czytać git diff (w zasadzie zunifikowane diff)
git stash show -p | patch -p1 --verbose --dry-run
Spowoduje to wyświetlenie podglądu krok po kroku tego, co normalnie zrobiłaby łatka. Dodatkową korzyścią tego jest to, że łatka również nie powstrzyma się przed napisaniem łatki do działającego drzewa, jeśli z jakiegoś powodu naprawdę potrzebujesz git, aby się zamknąć przed zatwierdzeniem przed modyfikacją, śmiało i usuń - susz uruchom i postępuj zgodnie z instrukcjami szczegółowymi.
Łącząc to, czego nauczyłem się w tym wątku i tym , kiedy chcę zobaczyć „co jest w skrytce”, najpierw uruchamiam:
git stash show stash@{0}
To pokaże, które pliki zostały zmodyfikowane. Następnie, aby uzyskać ładny wizualny diff w narzędziu difftool, robię:
git difftool --dir-diff stash@{0} stash@{0}^
Spowoduje to wyświetlenie wszystkich różnic naraz dla danej skrytki względem jej rodzica.
Możesz skonfigurować narzędzie różnicowe ~/.gitconfig
np. W Meld :
...
[diff]
tool = meld
FWIW Może to być nieco zbędne w stosunku do wszystkich innych odpowiedzi i jest bardzo podobne do przyjętej odpowiedzi, która jest na miejscu; ale może to komuś pomoże.
git stash show --help
da ci wszystko, czego potrzebujesz; w tym informacje o skrytce.
pokaż [<stash>]
Pokaż zmiany zarejestrowane w skrytce jako różnicę między stanem skrytki a jej pierwotnym elementem nadrzędnym. Gdy nie podano, pokazuje najnowszą. Domyślnie polecenie pokazuje diffstat, ale akceptuje dowolny format znany z git diff (np. Git stash show -p stash @ {1}, aby wyświetlić drugi najnowszy skrytka w formie łatki). Możesz użyć zmiennych konfiguracyjnych stash.showStat i / lub stash.showPatch, aby zmienić domyślne zachowanie.
Ona lista zapasów
git stash list
stash@{0}: WIP on feature/blabla: 830335224fa Name Commit
stash@{1}: WIP on feature/blabla2: 830335224fa Name Commit 2
Więc zdobądź numer skrytki i wykonaj:
Możesz to zrobić:
git stash show -p stash@{1}
Ale jeśli chcesz różnicę (inaczej jest pokazywanie skrytki, dlatego piszę tę odpowiedź. Diff
Rozważ aktualny kod w swoim oddziale i show
po prostu pokaż, co zastosujesz )
Możesz użyć:
git diff stash@{0}
lub
git diff stash@{0} <branch name>
Inną interesującą rzeczą jest:
git stash apply
git stash apply stash@{10}
Spowoduje to zastosowanie skrytki bez usuwania jej z listy, możesz git checkout .
usunąć te zmiany lub jeśli z przyjemnością git stash drop stash@{10}
usuniesz skrytkę z listy.
Odtąd nigdy nie zalecam używania git stash pop
i używania kombinacji git stash apply
i git stash drop
Jeśli zastosujesz ukrytą gałąź w niewłaściwej gałęzi ... czasami trudno jest odzyskać kod.
W zależności od tego, z czym chcesz porównać skrytkę (lokalne drzewo robocze / zatwierdzenie nadrzędne / zatwierdzenie główne), w rzeczywistości dostępnych jest kilka poleceń, między innymi stare dobre git diff
i bardziej szczegółowe git stash show
:
╔══════════════════════╦═══════════════════════════════╦═══════════════════╗
║ Compare stash with ↓ ║ git diff ║ git stash show ║
╠══════════════════════╬═══════════════════════════════╬═══════════════════╣
║ Local working tree ║ git diff stash@{0} ║ git stash show -l ║
║----------------------║-------------------------------║-------------------║
║ Parent commit ║ git diff stash@{0}^ stash@{0} ║ git stash show -p ║
║----------------------║-------------------------------║-------------------║
║ HEAD commit ║ git diff stash@{0} HEAD ║ / ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝
Choć git stash show
na pierwszy rzut oka wygląda na bardziej przyjazny dla użytkownika, git diff
jest tak naprawdę bardziej wydajny, ponieważ umożliwia określenie nazw plików dla bardziej skoncentrowanego diff. Osobiście skonfigurowałem aliasy dla wszystkich tych poleceń w mojej wtyczce zsh git .