Git diff przeciwko stashowi

Jak mogę zobaczyć zmiany, które un-stashing wprowadzi w bieżącym drzewie roboczym? Chciałbym wiedzieć, jakie zmiany zostaną wprowadzone przed ich zastosowaniem!

 1460
Author: SQB, 2011-10-06

14 answers

Zobacz najnowszy Schowek:

git stash show -p

Zobacz dowolny Schowek:

git stash show -p stash@{1}

From the git stash manpages:

Domyślnie polecenie wyświetla diffstat, ale przyjmie dowolny format znany git diff (np. git stash show-p stash@{1} Aby wyświetlić drugi ostatni stash w formie patcha).

 2034
Author: Amber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-18 09:28:53

Aby zobaczyć najnowszy Schowek:

git stash show -p

Aby zobaczyć dowolny Schowek:

git stash show -p stash@{1}

Używam również git diff do porównywania stash ' a z dowolną gałęzią.

Możesz użyć:

git diff stash@{0} master

Aby zobaczyć wszystkie zmiany w porównaniu do Branch master.


Lub możesz użyć:

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

Aby łatwo znaleźć tylko zmienione nazwy plików.

 335
Author: czerasz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-02 10:39:29

Jeśli gałąź, na której bazują twoje ukryte zmiany, zmieniła się w międzyczasie, to polecenie może być użyteczne:

git diff stash@{0}^!

Porównuje skrytkę z zatwierdzeniem, na którym jest oparta.

 110
Author: theintz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-27 13:23:38

Jeśli twoje drzewo robocze jest brudne, możesz porównać je do skrytki, najpierw wykonując polecenie brudne drzewo robocze, a następnie porównując je do skrytki. Następnie możesz cofnąć commit za pomocą brudnego drzewa roboczego (ponieważ możesz nie chcieć mieć tego brudnego commita w dzienniku zmian).

Możesz również użyć poniższego podejścia, aby porównać ze sobą dwa znaki (w tym przypadku po prostu pop jeden z tych znaków na początku).

  • Popełnij swoją brudną robotę drzewo:

    git add .
    git commit -m "Dirty commit"
    
  • Diff the stash with that commit:

    git diff HEAD stash@{0}
    
  • Następnie możesz przywrócić commit i umieścić go z powrotem w katalogu roboczym:

    git reset --soft HEAD~1
    git reset .
    

Teraz rozszyfrowałeś drzewo brudnej roboty swoim towarem i wróciłeś do miejsca, w którym byłeś na początku.

 46
Author: Magne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-26 23:35:57

@Magne ' S ODPOWIEDŹ jest jedyną (bardzo późną) datą, która odpowiada na najbardziej elastyczną / użyteczną interpretację pytania, ale jest to sprawiedliwe nieco bardziej skomplikowane niż to konieczne. Zamiast zatwierdzać i resetować, po prostu Schowaj kopię roboczą, porównaj, a następnie Odinstaluj.

git stash save "temp"
git diff stash@{0} stash@{1}
git stash pop

Pokazuje różnice między górną częścią stosu skrytki a Twoim folderem roboczym, tymczasowo zmieniając folder roboczy na górną część stosu skrytki (stash@{0}), przesuwając oryginalny top down one (stash@{1}) następnie porównując użycie oryginalnego top w pozycji "nowy zestaw", aby zobaczyć zmiany, które wynikałyby z zastosowania go na górze bieżącej pracy.

"Ale co, jeśli nie mam żadnej bieżącej pracy?" wtedy jesteś w normalnym nudnym przypadku. Po prostu użyj @Amber ' s answer

git stash show

Or @czerasz ' s answer

git diff stash@{0}

Albo przyznać, że schowanie i schowanie jest szybkie i łatwe, po prostu odinstaluj zmiany i sprawdź je. Jeśli nie chcesz je w tej chwili wyrzucić (aktualny indeks / folder roboczy zmienia się). W całości to

git stash apply
git diff
git reset
git checkout
 28
Author: SensorSmith,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-22 13:50:44

To działa dla mnie na git w wersji 1.8.5.2:

git diff stash HEAD
 19
Author: Rimian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-22 23:36:15

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

git diff stash@{0} -- fileName (with path)
 17
Author: Pramod B R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-16 00:47:42

W zależności od tego, z czym chcesz porównać skrytkę (lokalne drzewo robocze / commit nadrzędny / commit Główny), w rzeczywistości dostępnych jest kilka komend, wśród których 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       ║   /               ║
╚══════════════════════╩═══════════════════════════════╩═══════════════════╝

Podczas gdy git stash show wygląda na bardziej przyjazny dla użytkownika na pierwszy rzut oka, git diff jest w rzeczywistości bardziej wydajny, ponieważ umożliwia określanie nazw plików dla bardziej skoncentrowanego Diffa. Osobiście skonfigurowałem aliasy dla wszystkich tych poleceń w moim zsh Git plugin .

 13
Author: David Deprost,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2021-01-30 10:27:57

Jeśli masz narzędzia do diff (takie jak beyond compare)

git difftool stash HEAD
 9
Author: yerlilbilgin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-09 08:08:27

Jednym ze sposobów, aby to zrobić bez przesuwania czegokolwiek jest wykorzystanie faktu, że patch może odczytać git diff ' s (Unified diffs basically)

git stash show -p | patch -p1 --verbose --dry-run

To pokaże Ci krok po kroku, co zwykle zrobiłby patch. Dodatkową korzyścią jest to, że patch nie powstrzyma się przed zapisaniem patcha do drzewa roboczego, jeśli z jakiegoś powodu naprawdę potrzebujesz git ' a, aby zamknąć temat commiting-before-modifying, Usuń --dry-run i postępuj zgodnie z instrukcją instrukcje.

 4
Author: xenithorb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-07 23:44:20

Łącząc to, czego nauczyłem się w tym wątku i w tym, Kiedy chcę zobaczyć "co jest w skrytce", najpierw biegnę:

git stash show stash@{0}

Pokaże, jakie pliki zostały zmodyfikowane. Następnie, aby uzyskać ładny wizualny diff w difftool, robię:

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

Spowoduje wyświetlenie wszystkich różnic naraz danej skrytki względem jej rodzica.

Możesz skonfigurować narzędzie diff w ~/.gitconfig, np. za pomocą Meld:

...
[diff]
    tool = meld
 2
Author: Ferrard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Uważam, że git diff <current-branchname>..stash@{0} jest najbardziej intuicyjnym sposobem porównywania zmian pomiędzy lokalnym drzewem roboczym a najnowszą skrytką. W razie potrzeby należy zastąpić stash@{0} odpowiednim numerem skrytki.

Uważaj, że git diff stash@{0} może przynieść mylące wyniki. Jeśli dwie historie twojego skrytki i bieżącej gałęzi się od siebie różnią, różnica będzie wyglądać tak, jakbyś dodawał wszystkie nowe rzeczy do skrytki i usuwał wszystko unikalne dla bieżącej gałęzi.

Odpowiedź na podstawie git książka

Zwróć również uwagę, że Podwójna kropka .. i potrójna kropka ... określają różne porównania commitów, i mam na myśli podwójną kropkę dla tej odpowiedzi. Zobacz Git book po szczegóły

 2
Author: ciiyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-20 02:15:31

FWIW Może to być nieco zbędne dla wszystkich innych odpowiedzi i jest bardzo podobne do zaakceptowanej odpowiedzi, która jest na miejscu; ale może to komuś pomoże.

git stash show --help da Ci wszystko, czego powinieneś potrzebować; w tym informacje o pokazie skrytki.

Show []

Pokazuje zmiany zapisane w schowku jako różnicę między stanem przechowywanym a jego oryginalnym rodzicem. Gdy nie jest podana, pokazuje najnowszą. Domyślnie polecenie pokazuje diffstat, ale zaakceptuje dowolny format znany gitowi diffowi (np. git stash show-p stash@{1}, Aby wyświetlić drugi najnowszy stash w formie patcha). Możesz użyć skrytki.showStat i / lub stash.zmienne konfiguracyjne showPatch do zmiany domyślnego zachowania.

 1
Author: Rockin4Life33,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-18 16:40:27

She the list of stash

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 zrób:

Możesz zrobić:

 git stash show -p stash@{1}

Ale jeśli chcesz mieć diff (to co innego pokazać skrytkę, dlatego piszę tę odpowiedź. Diff zastanów się nad bieżącym kodem w swojej gałęzi i show po prostu pokaż, co zastosujesz )

Możesz użyć:

git diff stash@{0}

Lub

git diff stash@{0} <branch name>

Kolejną ciekawą rzeczą do zrobienia jest:

git stash apply
git stash apply stash@{10}

Dotyczy to skrytki bez wyjmowania jej z lista, możesz git checkout . usunąć te zmiany lub jeśli jesteś szczęśliwy git stash drop stash@{10} usunąć skrytkę z listy.

Stąd nigdy nie polecam używać git stash pop i używać kombinacji git stash apply i git stash drop jeśli zastosujesz skrytkę w niewłaściwej gałęzi... cóż, czasami trudno jest odzyskać kod.

 1
Author: Raúl Martín,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-07 21:31:22