Git diff przeciwko skrytce

Odpowiedzi:

1870

Zobacz najnowszą skrytkę:

git stash show -p

Zobacz dowolną skrytkę:

git stash show -p stash@{1}

Z git stashpodrę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).

Bursztyn
źródło
72
stash@{0}jest domyślny; potrzebujesz tylko argumentu, jeśli chcesz spojrzeć na poprzednie skrytki.
Cascabel,
52
Dobrze. Dostarczyłem go tylko po to, aby było jasne, jak patrzeć na inne skrytki poza tym {0}.
Amber,
74
To nie pokaże różnicy między skrytką a bieżącym działającym katalogiem, ale między skrytką a jej oryginalnym rodzicem. Dobrze? Z strony podręcznika: „Pokaż zmiany zarejestrowane w skrytce jako różnicę między stanem skrytki a jej pierwotnym rodzicem”.
Magne
14
@Amber - Prawda, chociaż jeśli twoje obecne drzewo robocze jest brudne, ma znaczenie i czyni je nieco bardziej skomplikowanym. Podszedłem pod tym kątem i znalazłem procedurę, którą podzieliłem w mojej odpowiedzi poniżej.
Magne
6
co oznacza -pskrót
Gerald
308

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.

czerasz
źródło
10
To nie odpowiada na konkretne pytanie. Jeśli utworzyłeś skrytkę z wzorca (aby zachować pracę na później), to wykonaj kilka zatwierdzeń dla innej pracy nad wzorzec, a następnie zrób 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.
Tom De Leu
52
Cieszę się, że odpowiedziałeś na pytanie, nawet jeśli nie była to odpowiedź na dokładne pytanie. Dało to więcej informacji i myślę, że wspaniale jest wiedzieć, jak uzyskać różnicę między gałęzią a jakąkolwiek inną gałęzią, którą chcesz porównać. Lubię też uczyć się flagi - tylko nazwa :)
Rebekah Waterbury
6
pozwala to również spojrzeć na różnice za pomocą niestandardowej przeglądarki różnic, np.git difftool --tool=... stash@{0} HEAD
Andre Holzner,
9
@TomDeLeu Dobra obserwacja i ważny punkt. Aby porównać przedmiot git diff stash@{0}^ stash@{0}
ukryty
1
Możesz także dodać nazwę pliku, git diff stash@{0} master -- filenameaby uzyskać zmiany w określonym pliku.
David,
104

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.

t.heintz
źródło
tak dobrze, że dodałem alias do ~/.gitconfig:laststash = diff stash@{0}^!
sbeam
5
Idealna para: git difftool stash^!dla różnicy ostatniego skrytki przeciwko zatwierdzeniu, na której była oparta, git difftool stash HEADdla różnicy ostatniej skrytki względem bieżącego zatwierdzenia (skrytka @ {n} dla wcześniejszych
skrytek
17
Dla tych, którzy byli tacy jak ja i nigdy nie widzieli ^! przed: commit ^! jest specyfikatorem zakresu, co oznacza: to zatwierdzenie, ale żadne z jego rodziców.
Jonathan Gawrych
„git diff stash @ {0} ^!” sprowadza się do „git diff stash @ {0} ^ stash @ {0} ~ 1 ^ stash @ {0} ~ 2 .......”, ale ponieważ git diff zajmuje tylko 2 zatwierdzenia, pokazuje różnicę między stash @ {0} i ^ stash @ {0} ~ 1 i wygląda na ^ na początku drugiego zatwierdzenia, nie robi to inaczej i git to ignoruje.
Naga Kiran,
Wolę tę wersję, aby móc korzystać z mojego preferowanego narzędzia do porównywania (oczywiście Beyond Compare!). Pokazuje to również zmianę w tym skrytce, która moim zdaniem jest pierwotnym pytaniem, w przeciwieństwie do alternatywy wspomnianej w powyższych komentarzach „git diff stash @ {X} ^ stash @ {X}”, która pokazuje więcej niż tylko ukryty diff.
user107172,
44

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.

Magne
źródło
Czy istnieje sposób, aby to zrobić, ale tylko zobaczyć różnicę plików, które zostałyby zmienione przez to, co jest w skrytce?
lagweezle
W 2020 r. Jest to znacznie prostsze; sprawdź moją aktualną odpowiedź .
David Deprost
Ciekawe, nie wiedziałem o tym 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?
Magne
Tak, rzeczywiście różni się od (prawdopodobnie brudnej) kopii roboczej. Korzystasz z niego po prostu wchodząc 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.
David Deprost
25

@ 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
SensorSmith
źródło
3
To proste podejście (skrytka, a następnie porównanie z inną skrytką) jest bezpieczne i łatwe do zrozumienia. W niektórych przypadkach możesz chcieć przechowywać ukryte pliki za pomocągit stash save -u
mleonard,
19

Działa to dla mnie w wersji git 1.8.5.2:

git diff stash HEAD
Rimian
źródło
2
Zwodniczy! Pytanie brzmi: jak mogę zobaczyć zmiany, które niestosowanie wprowadzi w bieżącym działającym drzewie? To pokazuje różnicę między skrytką a GŁOWĄ, która może być BARDZO różna od tego, co zostanie zastosowane git stash apply.
MikeJansen
Proszę przeczytać więcej na pytanie „Chciałbym wiedzieć, jakie zmiany zostaną wprowadzone przed ich zastosowaniem!”. Podaję szybką odpowiedź na to pytanie.
yerlilbilgin
Możesz także zobaczyć, że wszystkie pozostałe odpowiedzi dotyczą w jakiś sposób różnicowania bieżącej głowy (lub zestawu roboczego) względem skrytki. Dlaczego tylko moja odpowiedź wprowadza w błąd? To nie jest sprawiedliwe.
yerlilbilgin
@yerlilbilgin Zobacz moją odpowiedź na twoją odpowiedź poniżej.
MikeJansen
Możemy pominąć HEAD, to domyślnie, prawda?
Al.G.
10

Na wszelki wypadek, aby porównać plik w drzewie roboczym i skrytce, użyj poniższego polecenia

git diff stash@{0} -- fileName (with path)
Pramod BR
źródło
9

Jeśli masz narzędzia do porównywania (np. Bez porównania)

git difftool stash HEAD
yerlilbilgin
źródło
1
Zwodniczy! Pytanie brzmi: jak mogę zobaczyć zmiany, które niestosowanie wprowadzi w bieżącym działającym drzewie? To pokazuje różnicę między skrytką a GŁOWĄ, która może być BARDZO różna od tego, co zostanie zastosowane git stash apply.
MikeJansen
1
Jeśli uważasz, że jest to mylące, sprawdź wszystkie pozostałe odpowiedzi. To nie jest sprawiedliwe!
yerlilbilgin
1
Zauważysz, że skopiowałem ten sam komentarz do drugiej odpowiedzi, która była równie myląca (właściwie ta sama odpowiedź). Inne odpowiedzi, które już miały podobny komentarz, zostawiłem w spokoju. Jeśli zrozumiesz, jak działa skrytka git, zdasz sobie sprawę, że różnicowanie skrytki względem HEAD nie jest tym, co zostanie zastosowane (o to prosi OP). Rzeczywista „skrytka” to różnica między zatwierdzeniem skrytki a tym, co było przed nią. Ta poprawka jest następnie nakładana na HEAD. Więc jeśli chcesz wiedzieć, o co OP poprosił, musisz pokazać różnicę między ukrytą skrytką a zatwierdzeniem przed nią, co robią prawidłowe odpowiedzi.
MikeJansen,
1
Odpowiada to na pytanie bardziej bezpośrednio niż jakakolwiek inna (niepotrzebnie) długa odpowiedź i robi dokładnie to, o co poprosił PO, bez usuwania 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.
Sridhar Sarnobat
4

Jednym ze sposobów na zrobienie tego bez przenoszenia niczego jest skorzystanie z faktu, że patchpotrafi 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.

ksenitorb
źródło
2

Łą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 ~/.gitconfignp. W Meld :

...
[diff]
    tool = meld
Ferrard
źródło
1

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 --helpda 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.

Rockin4Life33
źródło
1

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ź. DiffRozważ aktualny kod w swoim oddziale i showpo 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 popi używania kombinacji git stash applyi git stash dropJeśli zastosujesz ukrytą gałąź w niewłaściwej gałęzi ... czasami trudno jest odzyskać kod.

Raúl Martín
źródło
1

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 diffi 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 showna pierwszy rzut oka wygląda na bardziej przyjazny dla użytkownika, git diffjest 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 .

David Deprost
źródło