Chciałbym wiedzieć, czy można wyodrębnić pojedynczy plik lub różnicę pliku ze skrytki git bez odrywania zestawu zmian skrytki.
Czy ktoś może podać jakieś sugestie / pomysły na ten temat?
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 jakgit 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 takgit stash pop
, jak by to robił .Jeśli użyjesz
git stash apply
zamiastgit 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.źródło
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:
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 zgit stash list
, jeśli masz więcej niż jeden. Zauważ, że tak jestdiff
i oferuje zastosowanie wszystkich różnic między gałęziami. Aby uzyskać zmiany tylko z jednego zatwierdzenia / skrytki, spójrz nagit cherry-pick --no-commit
.źródło
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 robigit applydiffat stash@{4}
tylko pliki, które zmieniły się między skrytką a jej rodzicem.Krótka odpowiedź
Aby zobaczyć cały plik:
git show stash@{0}:<filename>
Aby zobaczyć różnicę:
git diff stash@{0}^1 stash@{0} -- <filename>
źródło
diff
zdifftool
użyć ulubionego diff zewnętrznego.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:
Na podstawie odpowiedzi Jakuba Narębskiego - krótsza wersja
źródło
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.źródło
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ępniegit checkout f.c
w danym pliku, aby go skutecznie zresetować.Jeśli chcesz odblokować to uruchomienie pliku, wykonaj
git reset --hard
a następnie uruchomgit stash apply
ponownie, korzystając z faktu, żegit stash apply
nie usuwa różnic ze stosu ukrytych plików .źródło
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 zrobieniagit 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.źródło
Wykonaj poniższe czynności, aby zastosować zmiany do pliku w skrytce do drzewa roboczego.
Jest to ogólnie lepsze niż używanie,
git checkout
ponieważ nie utracisz żadnych zmian wprowadzonych do pliku od momentu utworzenia skrytki.źródło
Użyj rozszerzenia Git Stash w programie Visual Studio Code
źródło