Czy w git istnieje sposób na pokazanie niezatwierdzonych plików przechowywanych bez stosowania skrytki?

100

Jeśli biegnę git stash -u, mogę przechowywać niezatwierdzone pliki. Jednak wspomniane nieśledzone pliki w ogóle nie pojawiają się z rozszerzeniem git stash show stash@{0}. Czy istnieje sposób na pokazanie niezatwierdzonych plików przechowywanych bez stosowania skrytki?

Max Nanasy
źródło

Odpowiedzi:

121

Nieśledzone pliki są przechowywane w trzecim nadrzędnym zatwierdzeniu ukrytym. (W rzeczywistości nie jest to udokumentowane, ale jest dość oczywiste z zatwierdzenia, które wprowadziło funkcję -u, 787513 ... , i sposobu, w jaki reszta dokumentacji dotyczącagit-stash rzeczy frazowych ... lub po prostu robiąc git log --graph stash@{0})

Możesz wyświetlić tylko „nieśledzoną” część skrytki przez:

git show stash@{0}^3

lub po prostu samo „nieśledzone” drzewo, poprzez:

git show stash@{0}^3:

lub określony „nieśledzony” plik w drzewie za pośrednictwem:

git show stash@{0}^3:<path/to/file>

Niestety, nie ma dobrego sposobu, aby uzyskać podsumowanie różnic między wszystkimi stanami etapowymi + niestabilnymi + nieśledzonymi a stanami "bieżącymi". tj .: git show stash@{0}nie można zmusić do uwzględnienia plików bez śledzenia. Dzieje się tak, ponieważ obiekt drzewa samego zatwierdzenia ukrytego, o którym mowa jako stash@{0}:, nie zawiera żadnych zmian w stosunku do trzeciego, „niestacjonarnego” rodzica.

Wynika to ze sposobu ponownego stosowania skrytek: śledzone pliki można łatwo zastosować jako łaty, podczas gdy pliki nieśledzone mogą być stosowane tylko w teorii jako „całe pliki”.

Will Palmer
źródło
Czyli rodzicami zmiany skrytki są (1. Skrytka zatwierdzenia jest tworzona względem 2. Indeks 3. Nieśledzona kopia robocza), a samo zatwierdzenie skrytki zawiera śledzoną kopię roboczą? git stash showwydaje się pokazywać różnicę między kopią roboczą a numerem 1 (odpowiedni kod z git-stash.sh:, git diff ${FLAGS:---stat} $b_commit $w_commitw którym $ b_commit to # 1, a $ w_commit to zatwierdzenie skrytki); czy jest jakiś wbudowany sposób na git stash showdołączenie również # 3?
Max Nanasy
Jak można powiedzieć, że nie znaleźli sposób, aby uzyskać jednolity widok podsumowania zapas, ale można zobaczyć jego pełną informację w jednym z poleceniem: git log --graph --topo-order -m -u. matthewlmcclure.com/s/2014/01/10/…
Matt McClure
4
Zwróć uwagę, że otrzymujesz paskudny błąd ( fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.), jeśli w rzeczywistości nie masz nieśledzonych plików w tym schowku (ale myślisz, że tak).
Randall,
2
@antak: git stash shownie, nie pokazuje nieśledzonych plików (prawda przynajmniej dla git 2.7.4):
Norbert Bérci
1
Uwaga (2.13.2-linux): git stash popnajpierw spróbuje przywrócić nieśledzone pliki, a następnie spróbuje przywrócić śledzone pliki. Jeśli ta ostatnia operacja się nie powiedzie (np. Konflikt), pierwsza operacja nie zostanie wycofana (niezamknięty-plik-skrytka pozostanie bez zmian, ale pliki nie zostaną usunięte z dysku), więc nawet jeśli naprawisz konflikt, następny pop nie powiedzie się tak czy siak.
Marinos An
22

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

git rev-list -g stash

Ponieważ skrytki są reprezentowane jako trójdrożne zatwierdzenie scalające HEAD, indeksu i niezatwierdzonego nadrzędnego „roota” zatwierdzenia nieśledzonych plików, nieśledzone skrytki plików można wyświetlić, przesyłając powyższe dane wyjściowe do następującego:

git rev-list -g stash | git rev-list --stdin --max-parents=0

Przydatne zastosowania powyższych:

Pokaż tylko nieśledzone, przechowywane pliki

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

Oczywiście usuń, --stataby zobaczyć zawartość plików.

Znajdź określony plik

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

Pliki bez śledzenia Grepa

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

Wypisz całą zawartość wszystkich skrytek

git rev-list -g stash | git rev-list --stdin | xargs git show --stat
Steve
źródło
10

Aby wyświetlić nieśledzone pliki w skrytce:

git ls-tree -r stash@{0}^3 --name-only

Aby wyświetlić pełną różnicę wszystkich nieśledzonych plików (z zawartością):

git show stash@{0}^3

Te polecenia odczytują ostatnią (najnowszą) skrytkę. W przypadku wcześniejszych skrytek zwiększ liczbę za „skrytką @”, na przykład stash@{2}dla drugiej od ostatniej skrytki.

Powodem tego jest to, że prace git stashtworzy scalającej dla każdego zapasach, które mogą być przywoływane jako stash@{0}, stash@{1}itd. Pierwszy rodzic tego popełnienia jest głową w czasie zapasach, drugi rodzic zawiera zmian w plikach gąsienicowych, a trzecia (która może nie istnieć) zmiany w nieśledzonych plikach.

Jest to częściowo wyjaśnione na stronie podręcznika „Dyskusja” .

wisbucky
źródło
5

Aby zobaczyć wszystkie pliki w skrytce (zarówno śledzone, jak i nieśledzone), dodałem ten alias do mojej konfiguracji:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

Potrzeba jednego argumentu dotyczącego tego, który schowek chcesz wyświetlić. Zauważ, że nadal będzie przedstawiać go na dwóch listach wstecz.

if...fiSekcja zmienia argument bash $ 1 do 0, jeśli żaden została podjęta.

Randall
źródło
5

Obejście problemu: przemieszczanie plików przed ich przechowywaniem będzie git stash show -pdziałać zgodnie z oczekiwaniami.

git add .
git stash save

Uwaga: w ten sposób daje możliwość dodawania interaktywnych części, oto jak .
Uwaga: upewnij się, że nie przygotowałeś wcześniej pracy, w przeciwnym razie nie będziesz w stanie jej odróżnić.
To może być przydatne.

weshouman
źródło