Odpowiedzi:
Na stronie podręcznika git stash możesz przeczytać (w sekcji „Dyskusja”, zaraz po opisie „Opcje”), że:
Skrytka jest reprezentowana jako zatwierdzenie, którego drzewo rejestruje stan katalogu roboczego, a jej pierwszym nadrzędnym jest zatwierdzenie w HEAD podczas tworzenia skrytki.
Możesz więc traktować skrytkę (np. Skrytka stash@{0}
pierwsza / najwyższa) jako zatwierdzenie scalania i użyj:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Objaśnienie: stash@{0}^1
oznacza pierwszego rodzica danej skrytki, który, jak stwierdzono w powyższym wyjaśnieniu, jest zmianą, przy której zmiany zostały ukryte. Używamy tej formy „git diff” (z dwoma zatwierdzeniami), ponieważ stash@{0}
/ refs/stash
jest zatwierdzeniem scalania i musimy powiedzieć git, z którym rodzicem chcemy się różnić. Bardziej tajemniczy:
$ git diff stash@{0}^! -- <filename>
powinien również działać (zobacz wyjaśnienie składni w git rev-parsowaniurev^!
, w sekcji „Określanie zakresów”).
Podobnie, możesz użyć git checkout, aby sprawdzić pojedynczy plik poza skrytką:
$ git checkout stash@{0} -- <filename>
lub aby zapisać go pod inną nazwą pliku:
$ git show stash@{0}:<full filename> > <newfile>
lub
$ git show stash@{0}:./<relative filename> > <newfile>
( zwróć uwagę, że tutaj <pełna nazwa pliku> to pełna ścieżka do pliku w stosunku do głównego katalogu projektu (pomyśl: względem stash@{0}
).
Konieczne może być zabezpieczenie stash@{0}
przed rozszerzeniem powłoki, tj. Użycie "stash@{0}"
lub 'stash@{0}'
.
git checkout
stronę podręcznika użytkownika. Nie można upuścić pliku w innej lokalizacji. Istnieje odniesienie do tego w: stackoverflow.com/questions/888414/…
git checkout
podejście kopiuje dokładny plik ze skrytki - nie łączy go z tym, co znajduje się w twoim katalogu roboczym, tak jak git stash apply
zrobiłby to. (Jeśli więc wprowadzisz jakieś zmiany w podstawie, na której utworzono skrytkę, zostaną one utracone).
git stash apply
aby scalić zmiany w pliku, który został zmodyfikowany w drzewie roboczym od czasu ukrycia pliku, plik ten w drzewie roboczym musi zostać zainscenizowany. Aby automatyczne scalanie działało, te same pliki nie mogą być modyfikowane zarówno w kopii roboczej, jak i w ukrytej kopii do scalenia. Wreszcie zastosowanie ukrywania nie usuwa elementu ze schowka tak git stash pop
, jak by to robił .
Jeśli użyjesz git stash apply
zamiast git stash pop
tego, zastosuje skrytkę do twojego drzewa roboczego, ale nadal zachowa skrytkę.
Po wykonaniu tego możesz add
/ commit
plik, który chcesz, a następnie zresetować pozostałe zmiany.
git stash pop stash@{0}
(wymień ukryty Zmiany: git stash list
)
Istnieje prosty sposób na uzyskanie zmian z dowolnej gałęzi, w tym skrytek:
$ git checkout --patch stash@{0} path/to/file
Możesz pominąć specyfikację pliku, jeśli chcesz łatać w wielu częściach. Lub pomiń łatkę (ale nie ścieżkę), aby uzyskać wszystkie zmiany w jednym pliku. Zastąp 0
numerem skrytki z git stash list
, jeśli masz więcej niż jeden. Zauważ, że tak jest diff
i oferuje zastosowanie wszystkich różnic między gałęziami. Aby uzyskać zmiany tylko z jednego zatwierdzenia / skrytki, spójrz na git cherry-pick --no-commit
.
git help checkout
. --patch
wykonuje interaktywne scalanie, stosuje się do każdego kawałka, który zatwierdzisz w powłoce (lub cokolwiek, co zaoszczędzisz, jeśli zdecydujesz się e
porzucić łatkę). Sama ścieżka nadpisze plik, jak napisałem „wszystkie zmiany”.
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- wtedy robi git applydiffat stash@{4}
tylko pliki, które zmieniły się między skrytką a jej rodzicem.
Aby zobaczyć cały plik: git show stash@{0}:<filename>
Aby zobaczyć różnicę: git diff stash@{0}^1 stash@{0} -- <filename>
diff
z difftool
użyć ulubionego diff zewnętrznego.
$ git checkout stash@{0} -- <filename>
Uwagi:
Upewnij się, że wstawiłeś spację po „-” i parametrze nazwy pliku
Zamień zero (0) na określony numer skrytki. Aby uzyskać listę skrytek, użyj:
git stash list
Na podstawie odpowiedzi Jakuba Narębskiego - krótsza wersja
Możesz uzyskać różnicę dla skrytki za pomocą „ git show stash@{0}
” (lub jakiejkolwiek liczby skrytki; patrz „lista skrytek git”). Łatwo jest wyodrębnić sekcję pliku różnicowego dla pojedynczego pliku.
git show stash
aby pokazać najwyższą skrytkę (zwykle jedyną, którą masz). Podobnie możesz pokazać różnicę między bieżącą gałęzią a skrytką za pomocą git diff head stash
.
Najprostszym pojęciem do zrozumienia, choć może nie najlepszym, jest zmiana trzech plików i chowanie jednego pliku.
Jeśli zrobisz to, git stash
aby ukryć je wszystkie, git stash apply
przywróć je ponownie, a następnie git checkout f.c
w danym pliku, aby go skutecznie zresetować.
Jeśli chcesz odblokować to uruchomienie pliku, wykonaj git reset --hard
a następnie uruchom git stash apply
ponownie, korzystając z faktu, że git stash apply
nie usuwa różnic ze stosu ukrytych plików .
Jeśli ukryte pliki muszą zostać scalone z bieżącą wersją, skorzystaj z poprzednich sposobów, używając diff. W przeciwnym razie możesz użyć git pop
do ich odtajnienia, git add fileWantToKeep
do przemieszczenia pliku i zrobienia git stash save --keep-index
, do ukrycia wszystkiego oprócz tego, co jest na scenie. Pamiętaj, że różnica w ten sposób w porównaniu z poprzednimi polega na tym, że „wyskakuje” plik ze skrytki. Poprzednie odpowiedzi zachowują go, git checkout stash@{0} -- <filename>
więc idzie zgodnie z Twoimi potrzebami.
Wykonaj poniższe czynności, aby zastosować zmiany do pliku w skrytce do drzewa roboczego.
git diff stash^! -- <filename> | git apply
Jest to ogólnie lepsze niż używanie, git checkout
ponieważ nie utracisz żadnych zmian wprowadzonych do pliku od momentu utworzenia skrytki.
Użyj rozszerzenia Git Stash w programie Visual Studio Code