Czy można wyświetlić podgląd zawartości ukrytej w git?

554

Często odkładam pracę na później, potem pojawiają się inne rzeczy, a kilka tygodni później chcę sprawdzić skrytkę i dowiedzieć się, jakie zmiany wprowadziłby, gdybym zastosował ją do działającego drzewa w jego obecnym stanie.

Wiem, że mogę zrobić różnicę git na skrytce, ale to pokazuje mi wszystkie różnice między działającym drzewem a skrytką, podczas gdy ja po prostu jestem zainteresowany, aby wiedzieć, co zastosuje skrytka się zmieni.

W jaki sposób mogę to zrobić?

Benjol
źródło
1
colorized diff output: git stash show -p stash@{1} >~/.diff && vim ~/.diff(nie musi być vim. żadnym edytorem tekstu, o ile edytor tekstu obsługuje podświetlanie składni dla diffdanych wyjściowych).
Trevor Boyd Smith

Odpowiedzi:

727

git stash showpokaże Ci pliki, które zmieniły się w Twojej ostatniej skrytce. Możesz dodać -popcję pokazującą różnicę.

git stash show -p

Jeśli skrytka, którą jesteś zainteresowany, nie jest najnowsza, dodaj nazwę skrytki na końcu polecenia:

git stash show -p stash@{2}
Jlew
źródło
To wygląda dobrze i widzę to w instrukcji, ale kiedy próbuję, daje mi to fatal: unable to create temp-file: Invalid argument- jakiś pomysł, dlaczego?
Benjol
29
Użyj, git stash show -p stash@{0}aby zobaczyć konkretną skrytkę. 0 pokazuje ostatni dźwięk, 1 drugi ostatni… itd. git stash listPokaże wszystkie dostępne.
brita_
6
Jeśli używasz PowerShell, będziesz musiał umieścić nazwę skrytki w cudzysłowie. (tj git stash show -p 'stash@{0}')
Scott-Pascoe
1
Jeśli chcesz zapisać różnice w użyciu plikugit stash show -p stash@{0}> stash.txt
S_K
87

Aby wyświetlić bieżącą listę skrytek:

git stash list

Zobaczysz taką listę:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

Aby wyświetlić diff na którymkolwiek z tych skrytek:

git stash show -p stash@{n}
segfault
źródło
34

Jestem fanem gitkgraficznego interfejsu użytkownika do wizualizacji repozytoriów git. Możesz zobaczyć ostatni przedmiot ukryty w:

gitk stash

Możesz także użyć widoku dowolnej ze swoich ukrytych zmian (wymienionych przez git stash list). Na przykład:

gitk stash@{2}

Na poniższym zrzucie ekranu możesz zobaczyć ukrytą skrzynkę jako zatwierdzenie w lewym górnym rogu, kiedy i skąd pochodzi ona w historii zatwierdzeń, listę plików zmodyfikowanych w prawym dolnym rogu i różnicę linia po linii w dolnej -lewo. Przez cały czas schowek jest schowany.

zaczynam oglądać skrytkę

Jeff Ward
źródło
5
Możesz podać wiele stash@{X}wartości w wierszu poleceń, aby zobaczyć więcej wyników na raz, ale nie znalazłem prostego sposobu, aby po prostu powiedzieć „pokaż wszystkie wpisy skrytki” w gitk.
nobar
5
gitk stashwydaje się być gitk stash@{0}
krótszy
3
aby wyświetlić wszystkie skrytki w gitku, których możesz użyć, gitk `git stash list --pretty=format:%gd`a następnie wyszukaj „WIP on”, aby przejść do następnej skrytki.
Ikar Pohorský
2
gitk --reflogpozwala zobaczyć wszystkie skrytki i więcej.
nobar
1
gitk było jedynym narzędziem, które pokazało mi bezpośrednio, że w skrytce zapisane są nieśledzone pliki. Wszystkie pozostałe pokazały mi „bez różnic”.
Martin Bonner wspiera Monikę
22

Aby wyświetlić wszystkie zmiany w niewyskakującym schowku:

git stash show -p stash@{0}

Aby wyświetlić zmiany jednego konkretnego pliku w niepakowanym schowku:

git diff HEAD stash@{0} -- path/to/filename.php
Wesley Musgrove
źródło
w przypadku, gdy nie pamiętasz nazw plików, działa to również dla wszystkich plików zmienionych git diff HEAD stash @ {0}
Simeon
Dla jasności: -pjest skrótem od --patch. Opcja pochodzi z git-diff. Jeśli wolisz długą formę, możesz pisać git stash show --patch.
Peterino
5

Poza rekomendacją gitk w Czy można wyświetlić podgląd zawartości ukrytej w git? możesz zainstalować TIG i zadzwoń tig stash. Ten darmowy / otwarty program konsoli pozwala również wybrać, którą skrytkę chcesz porównać

Bruce
źródło
1
Wygląda na idealne narzędzie do zarządzania wieloma skrytkami! Możesz także pop i upuszczać skrytki odpowiednio za pomocą klawiszy Pi !.
Ikar Pohorský
Alternatywy TUI są zawsze dobre, ale dla ludzi już przyzwyczajonych lub w jakiś sposób preferujących gitk stosunkowo łatwo jest zhakować go, aby pokazać wszystkie skrytki .
1737973
4

Używam tego, aby zobaczyć wszystkie moje skrytki z podświetlaniem różnic kolorów (w Fedorze 21):

git stash list | 
  awk -F: '{ print "\n\n\n\n"; print $0; print "\n\n"; 
  system("git -c color.ui=always stash show -p " $1); }' | 
  less -R

(Na podstawie Git: zobacz, co jest w skrytce bez zastosowania skrytki )

seanf
źródło
4

Kiedy pytanie zostało zadane po raz pierwszy, być może nie była to opcja, ale jeśli używasz PyCharm, możesz użyć UnStash Changesnarzędzia (VCS-> Git-> UnStash Changes ...). Pozwala to wyświetlić listę ukrytych zmian, a także pop, upuścić, wyczyścić lub zastosować (w razie potrzeby do nowej gałęzi):

Odblokuj okno zmian

i przeglądaj zmienione pliki według skrytki:

Okno Wpływ na ścieżki

a także różnice w pliku. W różnicach możesz wybrać pojedyncze zmiany, aby zastosować zmiany ukryte do działającej gałęzi (używając szewronu skierowanego w lewo):

wprowadź opis zdjęcia tutaj

hlongmore
źródło
3

Możesz wyświetlić listę wszystkich skrytek za pomocą następującego polecenia:

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

Najnowsza skrytka jest pierwsza.

Możesz po prostu wybrać indeks nskrytki z powyższej listy i użyć następującego polecenia, aby wyświetlić szczegóły skrytki

git stash show -p stash@{3}

Podobnie,

git stash show -p stash@{n}

Możesz także sprawdzić różnicę za pomocą polecenia:

git diff HEAD stash@{n} -- /path/to/file
Vishvajit Pathak
źródło
3

tak, najlepszym sposobem, aby zobaczyć, co jest modyfikowane, jest zapisanie w pliku w ten sposób:

git stash show -p stash@{0} > stash.txt
Walterwhites
źródło
2

Najpierw możemy skorzystać z listy skrytek git, aby uzyskać wszystkie elementy skrytki:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

Następnie możemy użyć git stash show stash@{N}do sprawdzenia plików pod określoną skrytką N. Jeśli go zwolnimy, możemy uzyskać:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Powodem tego może być to, że skorupa zjada nawiasy klamrowe i git widzi, stash@2a nie stash@{2}. Aby to naprawić, musimy użyć pojedynczych cudzysłowów dla nawiasów klamrowych, takich jak:

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.
akhil_mittal
źródło
2

Zobacz listę ukrytych zmian

git stash list

Do przeglądania listy plików zmienionych w określonej skrytce

git stash show -p stash@{0} --name-only

Do przeglądania określonego pliku w skrytce

git show stash@{0} path/to/file
Bharat
źródło
1

Pokaż wszystkie skrytki

Tylko nazwy plików:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

Pełna zawartość pliku we wszystkich skrytkach:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

Otrzymasz pokolorowane wyjście różnicowe, które możesz przewijać stronami space (do przodu ) i b( do tyłu ) oraz qzamykać pager dla bieżącego skrytki. Jeśli wolisz mieć go w pliku, dołącz > stashes.diffdo polecenia.

ccpizza
źródło
1

Oprócz istniejących odpowiedzi, które sugerują użycie (aby pokazać różnicę między skrytkami od trzeciego do ostatniego)

git stash show -p stash@{2}

Zauważ, że w git-stashdokumentacji jest napisane, że

Do skrytek można również odwoływać się, określając tylko indeks skrytki (np. Liczba całkowita njest równoważna stash@{n}).

Dlatego możliwe jest również użycie (jest to odpowiednik powyższego polecenia)

git stash show -p 2

Co powinno również uniknąć niektórych problemów z Powershell .

użytkownik202729
źródło
1

Podoba mi się, jak gitkmogę pokazać dokładnie to, co nie zostało wyśledzone lub siedzi w indeksie, ale domyślnie pokaże te ukryte „zatwierdzenia” pośrodku wszystkich innych zatwierdzeń w bieżącej gałęzi.

Sztuką jest uruchomienie gitk w następujący sposób:

gitk "stash@{0}^!"

(Cytowanie ma umożliwić działanie w programie Powershell, ale w ten sposób powinno działać również w innych powłokach).

Jeśli spojrzysz na tę składnię na stronie pomocy gitrevisions , znajdziesz następujące informacje:

Zapis r1^!obejmuje zatwierdzenie r1, ale wyklucza wszystkich jego rodziców. Notacja ta sama w sobie oznacza pojedynczy zatwierdzenie r1 .

To najwyraźniej spowoduje, że gitk znajdzie się w takim trybie, że tylko bezpośredni rodzice wybranego zatwierdzenia zostaną pokazani, co dokładnie mi się podoba.


Jeśli chcesz posunąć się dalej i wymienić wszystkie skrytki, możesz uruchomić to:

gitk `git stash list '--pretty=format:%gd^!'`

(Te pojedyncze cudzysłowy w backtikach są konieczne, aby uspokoić Basha, w przeciwnym razie narzeka na wykrzyknik)

Jeśli korzystasz z systemu Windows i używasz cmd lub Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"
JBert
źródło
0

Poniższej komendy można użyć do wyodrębnienia różnicy ukrytej zmiany w każdym innym skrytce, zatwierdzeniu, gałęzi lub HEAD.

git stash show
git show
git diff
git difftool

Zobaczmy, jak możemy użyć każdego z wyżej wymienionych poleceń.

  1. git stash show

Proste polecenie git stash show daje bardzo krótkie podsumowanie zmian w pliku, ale nie pokazuje różnicy zmian w stosunku do bieżącego HEAD.

  1. git show

Polecenie git-show służy do wyświetlania różnego rodzaju obiektów.

Polecenie git-show służy nie tylko do wizualizacji zmian skrytki, ale także służy do wyświetlania jednego lub więcej obiektów, takich jak obiekty BLOB, drzewa, znaczniki i zatwierdzenia.

  1. git diff

Polecenie git-diff jest także jednym z typowych poleceń używanych do wyświetlania zmian między zatwierdzeniami, zatwierdzaniem i działającym drzewem itp.

Domyślnie git diff pokaże różnicę wybranej skrytki względem (zmodyfikowanych plików) bieżącego stanu repozytorium, chyba że określono inne odwołanie do skrytki lub zatwierdzenie.

Aby uzyskać różnicę między najwyżej ukrytą skrytką @ {0} a gałęzią master:

$ git diff stash @ {0} master

Wyświetlaj tylko nazwy plików bez różnic zmian:

$ git diff - stash-only-name @ {0} master

Zobacz różnicę między wybranymi skrytkami dla wybranego pliku:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. git difftool

Polecenia git-difftool można także użyć do znalezienia różnicy między wybraną skrytką a wybranym zatwierdzeniem lub gałęzią lub skrytką

Zobacz różnicę między dwiema ostatnimi skrytkami:

$ git difftool stash @ {0} stash @ {0} ^ 1

git difftool --dir-diff stash @ {0} stash @ {0} ^ 1

Podsumowanie:

Polecenia przydatne do wyodrębnienia pliku różnicowego z wybranej skrytki git stash show, git show, git diff, git difftool.

Zobacz różnicę za pomocą polecenia git stash show,

git stash show -p stash @ {0}

Zobacz zmiany w skrytce za pomocą polecenia git show,

git show stash @ {1}

Zobacz różnicę między ostatnim ukrytym a wybranym zatwierdzeniem za pomocą polecenia git diff,

git diff stash @ {0}

Bibliografia:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

hxysayhi
źródło