Przechowuj zmiany, zachowując zmiany w katalogu roboczym w Git
146
Czy istnieje git stashpolecenie, które przechowuje twoje zmiany, ale zachowuje je również w katalogu roboczym? Więc w zasadzie git stash; git stash applyw jednym kroku?
@MariuszPawelski Nie, nie bardzo. To pytanie jest bardziej szczegółowe niż moje. Odpowiedź na moje pytanie brzmiała po prostu „nie”. Dzięki za link, może być pomocny dla niektórych osób, a nawet dla mnie w późniejszym czasie.
Michael Dorst
Żeby było jasne, moje pytanie jest inne, ponieważ nie wymagam, aby pliki pozostały nietknięte. Szukałem tylko alternatywy dla git stash && git stash apply. Zauważysz, że odpowiedzi na to pytanie są zupełnie inne niż moje.
Michael Dorst
ah, racja, twoje pytanie jest nieco mniej szczegółowe. Ale zadałem to pytanie, ponieważ jego odpowiedzi również spełniają twoje wymagania. W ten sposób to pytanie jest wyświetlane jako „Połączone” na pasku bocznym, więc może być pomocne dla kogoś.
Mariusz Pawelski
Odpowiedzi:
156
Innym sposobem na to jest przygotowanie zmian, które chcesz zachować, a następnie przechowywanie wszystkiego za pomocą --keep-index:
jest to zdecydowanie najprostsze wyjaśnienie --keep-index, jakie widziałem. Nie zrozumiałem całkiem znaczenia przez sposób, w jaki to było sformułowane w dokumentach.
detektywów
52
git stasha następnie git stash apply( git stash && git stash apply) ukryje pliki i zastosuje ukryty bezpośrednio po nim. Po wszystkim będziesz miał swoje zmiany w skrytce i pracy w reż.
Jeśli chcesz, możesz utworzyć alias w jednym kawałku. Po prostu umieść coś takiego w ~/.gitconfig:
[alias]
sta = "!git stash && git stash apply"
Wadą tego podejścia jest to, że wszystkie pliki są przechowywane i odtwarzane. Oznacza to, że sygnatury czasowe plików, o których mowa, zostaną zmienione. (Powoduje, że Emacs narzeka, gdy próbuję zapisać plik, jeśli otworzyłem go przed wykonaniem czynności git sta, i może spowodować niepotrzebne przebudowy, jeśli używasz makelub znajomych).
Jak mogę zmodyfikować ten alias, aby był używany git stash savez argumentem, a następnie zrobić git stash apply?
spinningarrow
1
@JaySidri, bang oznacza, że w rzeczywistości jest to polecenie zewnętrzne, a nie sam argument git. Zgodnie z dokumentacją : „Jak widać, Git po prostu zastępuje nowe polecenie jakimkolwiek aliasem. Jednak może chcesz uruchomić polecenie zewnętrzne, a nie podkomendę Git. W takim przypadku zaczynasz polecenie z ! postać."
madhead
10
Niewielkie ulepszenie odpowiedzi, które w praktyce może być przydatne.
$ git add modified-file.txt
(OR $ git add . ---- for all modified file)
$ git stash save --keep-index "Your Comment"
UWAGA: nie działa bez "git add" (np. Dla zmodyfikowanych, ale nie dodanych do plików commita)
alex_1948511
4
Jest pewna sztuczka, która może ci pomóc, nie schować, ale FWIW:
git add -A
git commit -m "this is what's called stashing" (create new stash commit)
git tag stash (mark the commit with 'stash' tag)
git reset HEAD~ (Now go back to where you've left with your working dir intact)
Więc teraz masz do swojej dyspozycji skrytkę z tagiem commit, ale i tak nie można tego zrobić, git stash popale możesz zrobić takie rzeczy, jak tworzenie łatek lub resetowanie plików itp., A tak przy okazji, twoje robocze pliki katalogów pozostają nienaruszone.
Zauważ, że to nie robi wszystkiego , cogit stash push robi. Na przykład nie dodaje nazwy gałęzi do zatwierdzenia, np. „ stash@{0}: On myBranch: Stash commit message”.
git stash && git stash apply
. Zauważysz, że odpowiedzi na to pytanie są zupełnie inne niż moje.Odpowiedzi:
Innym sposobem na to jest przygotowanie zmian, które chcesz zachować, a następnie przechowywanie wszystkiego za pomocą
--keep-index
:Powyższe polecenia przechowują wszystko, ale pozostawiają pliki w katalogu roboczym.
Z oficjalnej dokumentacji Linux Kernel Git dla
git stash
lub z git-scm :źródło
git stash
a następniegit stash apply
(git stash && git stash apply
) ukryje pliki i zastosuje ukryty bezpośrednio po nim. Po wszystkim będziesz miał swoje zmiany w skrytce i pracy w reż.Jeśli chcesz, możesz utworzyć alias w jednym kawałku. Po prostu umieść coś takiego w
~/.gitconfig
:Wadą tego podejścia jest to, że wszystkie pliki są przechowywane i odtwarzane. Oznacza to, że sygnatury czasowe plików, o których mowa, zostaną zmienione. (Powoduje, że Emacs narzeka, gdy próbuję zapisać plik, jeśli otworzyłem go przed wykonaniem czynności
git sta
, i może spowodować niepotrzebne przebudowy, jeśli używaszmake
lub znajomych).źródło
git stash; git stash apply
igit stash && git stash apply
?&&
uruchamia drugie polecenie tylko wtedy, gdy najpierw zwróci kod stanu zerowego .git config --global alias.sta "!git stash && git stash apply"
powinien to zrobić.git stash save
z argumentem, a następnie zrobićgit stash apply
?Niewielkie ulepszenie odpowiedzi, które w praktyce może być przydatne.
źródło
Jest pewna sztuczka, która może ci pomóc, nie schować, ale FWIW:
Więc teraz masz do swojej dyspozycji skrytkę z tagiem commit, ale i tak nie można tego zrobić,
git stash pop
ale możesz zrobić takie rzeczy, jak tworzenie łatek lub resetowanie plików itp., A tak przy okazji, twoje robocze pliki katalogów pozostają nienaruszone.źródło
Możesz użyć,
git stash create
aby utworzyć zmianę skrytki, a następnie zapisać ją w skrytce za pomocągit stash store
:Można to zapisać w aliasie git, aby było wygodniej:
Zauważ, że to nie robi wszystkiego , co
git stash push
robi. Na przykład nie dodaje nazwy gałęzi do zatwierdzenia, np. „stash@{0}: On myBranch: Stash commit message
”.źródło
man git-stash
mówi, że-m <message>
musi nastąpić przed hashem zatwierdzenia. Z wyjątkiem zmian w najnowszym gicie.