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?

Michael Dorst
źródło
To samo pytanie: stackoverflow.com/q/6315459/350384
Mariusz Pawelski
Czy to odpowiada na twoje pytanie? Polecenie Git, aby zapisać skrytkę bez modyfikowania drzewa roboczego?
Mariusz Pawelski
1
@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:

$ git add modified-file.txt
$ git stash push --keep-index

Powyższe polecenia przechowują wszystko, ale pozostawiają pliki w katalogu roboczym.

Z oficjalnej dokumentacji Linux Kernel Git dlagit stash lub z git-scm :

Jeśli ta --keep-indexopcja jest używana, wszystkie zmiany już dodane do indeksu pozostają nienaruszone.

Cirelli94
źródło
3
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).

szaleniec
źródło
1
także, jaka jest różnica między git stash; git stash applyi git stash && git stash apply?
Michael Dorst
14
Uważam, że różnica polega na tym, że &&uruchamia drugie polecenie tylko wtedy, gdy najpierw zwróci kod stanu zerowego .
szaleniec
2
@anthropomorphic git config --global alias.sta "!git stash && git stash apply"powinien to zrobić.
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"
Premchandra Singh
źródło
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.

KenIchi
źródło
3

Możesz użyć, git stash createaby utworzyć zmianę skrytki, a następnie zapisać ją w skrytce za pomocą git stash store:

git stash store $(git stash create) -m "Stash commit message"

Można to zapisać w aliasie git, aby było wygodniej:

git config --global alias.stash-keep '!git stash store $(git stash create)'

git stash-keep -m "Stash commit message"

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”.

M. Justin
źródło
1
Kocham tą jedną!! Jedna poprawka: man git-stashmówi, że -m <message>musi nastąpić przed hashem zatwierdzenia. Z wyjątkiem zmian w najnowszym gicie.
Tanius