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.