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?




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.


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


1
także, jaka jest różnica między git stash; git stash applyi git stash && git stash apply?
Michael Dorst


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"

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.


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


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.