Mam zmiany w pliku oraz nowy plik i chciałbym użyć git stash, aby je odłożyć, gdy przechodzę do innego zadania. Ale git sam w sobie ukrywa tylko zmiany w istniejącym pliku; nowy plik pozostaje w moim pracującym drzewie, zaśmiecając moją przyszłą pracę. Jak ukryć ten nieśledzony plik?
1432
git stash show
nic nie zwraca i możesz ulec pokusie, aby go upuścić (tak jak zrobiłem, gdy zawierał przydatny skrypt, który napisałem kilka miesięcy temu → jak odzyskać upuszczoną skrytkę )Odpowiedzi:
Aby ukryć swój katalog roboczy, w tym nieśledzone pliki (szczególnie te, które znajdują się w .gitignore), prawdopodobnie prawdopodobnie chcesz użyć tego cmd:
git stash --include-untracked
Więcej szczegółów:
Aktualizacja 17 maja 2018 r .:
Nowe wersje git mają teraz
git stash --all
przechowywanie wszystkich plików, w tym plików nieśledzonych i ignorowanych.git stash --include-untracked
nie dotyka już ignorowanych plików (testowane na git 2.16.2).Oryginalna odpowiedź poniżej:
Uwaga, zrobienie tego spowoduje trwałe usunięcie plików, jeśli masz jakieś wpisy katalogu / * w pliku gitignore.
Począwszy od wersji 1.7.7 możesz używać
git stash --include-untracked
lubgit stash save -u
przechowywać ukryte pliki bez umieszczania ich w stosie.Dodaj (
git add
) plik i zacznij go śledzić. Następnie ukryj. Ponieważ cała zawartość pliku jest nowa, zostaną one ukryte i można w razie potrzeby nimi manipulować.źródło
git stash --include-untracked
wcześniejgit stash --all
. Po pierwsze, lepiej odpowiada na pytanie OP w 2019 r., A po drugie, ponieważ - wszystko robi coś, czego większość użytkowników prawdopodobnie nie chce, ponieważ usuwa wszystkie pliki, które sąPocząwszy od git 1.7.7,
git stash
akceptuje--include-untracked
opcję (lub skrót-u
). Aby dołączyć do pliku ukryte pliki, użyj jednego z następujących poleceń:Uwaga, zrobienie tego spowoduje trwałe usunięcie plików, jeśli masz jakieś wpisy katalogu / * w pliku gitignore.
źródło
.gitignore
wygląda takignoredDirectory
i nieignoredDirectory/*
usuwa tych, które nie są śledzone. Nawet nieśledzone pliki nie tylko katalogi.*.extension
wpisów?git
1.8.3-u
(--include-untracked
) może przechowywać i usuwać nieśledzone pliki w porządku, alegit stash show
nie wyświetla nieśledzonych plików, które są wDodaj plik do indeksu:
Cała zawartość indeksu, a także wszelkie nieustawione zmiany w istniejących plikach, wszystkie znajdą się w schowku.
źródło
git add .
z jakiegoś powodu nie wziął tego pod uwagęW git bash, ukrywanie nieśledzonych plików odbywa się za pomocą polecenia
lub
http://git-scm.com/docs/git-stash
git stash usuwa wszelkie nieśledzone lub niezaangażowane pliki z twojego obszaru roboczego. I możesz przywrócić skrytkę git za pomocą następujących poleceń
Spowoduje to umieszczenie pliku z powrotem w lokalnym obszarze roboczym.
Moje doświadczenie
Musiałem wykonać modyfikację mojego pliku gitIgnore, aby uniknąć przenoszenia plików .classpath i .project do zdalnego repozytorium. Od tej chwili nie wolno mi przenosić tego zmodyfikowanego .gitIgnore w zdalne repozytorium.
Pliki .classpath i .project są ważne dla środowiska Eclipse - mojego edytora Java.
Najpierw wybiórczo dodałem resztę plików i zobowiązałem się do inscenizacji. Ostateczne wypychanie nie może być jednak wykonane, chyba że zmodyfikowane pliki .gitIgnore i pliki nieśledzone będą mieć na myśli. .project i .classpath nie są ukryte.
użyłem
do ukrywania zmodyfikowanego pliku .gitIgnore.
Do schowania pliku .classpath i .project użyłem
i usunął pliki z mojego obszaru roboczego. Brak tych plików pozbawia mnie możliwości pracy w miejscu pracy w środowisku Eclipse. Kontynuowałem wykonywanie procedury wypychania zatwierdzonych plików do pilota. Kiedy udało się to zrobić, użyłem
To wkleiło te same pliki z powrotem w moim obszarze roboczym. To dało mi moją zdolność do pracy nad tym samym projektem w środowisku Eclipse. Mam nadzieję, że odrzuci to nieporozumienia.
źródło
~/.gitignore
.Jak już powiedziano w innym miejscu, odpowiedź znajduje się
git add
w pliku. na przykład:Jednak pytanie pojawia się również w innej odpowiedzi: Co, jeśli tak naprawdę nie chcesz dodać pliku? O ile mogę powiedzieć, musisz. I następujące działania NIE będą działać:
to się nie powiedzie, jak następuje:
Więc co możesz zrobić? Cóż, musisz naprawdę dodać plik, jednak możesz później skutecznie go usunąć, używając
git rm --cached
:Następnie możesz kontynuować pracę, w takim samym stanie, w jakim byłeś wcześniej
git add
(mianowicie z nieśledzonym plikiem o nazwiepath/to/untracked-file
; oraz innymi zmianami, które mogłeś mieć do śledzenia plików).Inną możliwością przepływu pracy w tym przypadku byłoby coś takiego:
[Uwaga: Jak wspomniano w komentarzu @mancocapac, możesz chcieć dodać
--exclude-standard
dogit ls-files
polecenia (tak,git ls-files -o --exclude-standard
).]... które można również łatwo napisać w skrypcie - wystarczyłyby nawet aliasy (przedstawione w składni zsh; dostosuj w razie potrzeby) [skróciłem też nazwę pliku, aby pasowała do ekranu bez przewijania w tej odpowiedzi; możesz zamienić alternatywną nazwę pliku]:
Zauważ, że ten drugi może być lepszy jako skrypt powłoki lub funkcja, aby umożliwić dostarczanie parametrów
git stash
, na wypadek, gdybyś nie chciał,pop
aleapply
i / lub chcesz móc określić konkretną skrytkę, zamiast tylko zajmować pierwsze miejsce jeden. Być może to (zamiast drugiego aliasu powyżej) [białe spacje pasują bez przewijania; dodaj ponownie, aby zwiększyć czytelność]:Uwaga : W tym formularzu musisz podać argument akcji, a także identyfikator, jeśli chcesz podać identyfikator skrytki, np.
unstashall apply stash@{1}
Lubunstashall pop stash@{1}
Które oczywiście umieścisz w swoim
.zshrc
lub jego odpowiedniku, aby istniało długoterminowo.Mam nadzieję, że ta odpowiedź jest dla kogoś pomocna, łącząc wszystko w jedną odpowiedź.
źródło
W wersji git 2.8.1: następujące działa dla mnie.
Aby zapisać zmodyfikowane i nieśledzone pliki w skrytce bez nazwy
Aby zapisać zmodyfikowane i nieśledzone pliki w skrytce z nazwą
Możesz użyć pop lub zastosować później w następujący sposób.
źródło
git stash show
nie pokazałem ich. Kiedy próbowałemgit stash apply
, pojawiło się „błąd: nie można przywrócić nieśledzonych plików ze skrytki”. Pliki zostały jednak ponownie wymienione jako nieśledzone, ale zmiany w plikach śledzonych nie zostały przywrócone. Myślę, że te pliki można przywrócić indywidualnie, sprawdzając je ze skrytki, ale to rozwiązanie nie było tym, na co liczyłem.Byłem w stanie ukryć tylko nieśledzone pliki, wykonując:
Ostatni wyskakuje skrytka śledzonych plików, pozostawiając w ten sposób tylko te nieśledzone.
źródło
git stash save -u
nie tylko zapisujeuntracked
pliki, ale zapisuje zarówno pliki, jaktracked
iuntracked
. Myślę, że pierwsze uratowanie, które robisz, nie jest w tym przypadku koniecznością. Jest to dobry schemat w atlassian.com/git/tutorials/saving-changes/...Jeśli chcesz ukryć nieśledzone pliki, ale zachowaj indeksowane pliki (na przykład te, które zamierzasz zatwierdzić), po prostu dodaj
-k
opcję (zachowaj indeks) do-u
źródło
Możesz to po prostu zrobić za pomocą poniższego polecenia
lub
Aby uzyskać więcej informacji o git stash, odwiedź ten post (kliknij tutaj)
źródło
załóżmy, że nowy i nieśledzony plik nazywa się: „views.json”. jeśli chcesz zmienić gałąź poprzez ukrywanie stanu twojej aplikacji, zazwyczaj piszę:
Następnie:
I byłoby schowane. Następnie mogę po prostu zmienić gałąź za pomocą
źródło
Istnieje kilka poprawnych odpowiedzi tutaj, ale chciałem zwrócić uwagę, że w przypadku nowych całych katalogów,
'git add path'
będzie NIE pracę. Więc jeśli masz kilka nowych plików w ścieżce bez śledzenia i zrób to:spowoduje to wyświetlenie następującego komunikatu:
a jeśli ścieżka bez śledzenia jest jedyną ścieżką, którą chowasz , skrytka „skrytka tymczasowa” będzie pustą skrytką. Prawidłowym sposobem jest dodanie całej ścieżki, a nie tylko nazwy katalogu (tj. Zakończenie ścieżki znakiem „/”):
źródło
Pomyślałem, że można to rozwiązać, mówiąc gitowi, że plik istnieje, zamiast przekazywać całą jego zawartość do obszaru pomostowego, a następnie wywołać
git stash
. Araqnid opisuje jak to zrobić.lub
Jednak to ostatnie nie działa:
źródło
mój ulubiony, ponieważ zapisuje także pliki, które dodałeś i których nie wystawiłeś.
źródło
Napotkałem podobny problem podczas korzystania z Sourcetree z nowo utworzonymi plikami (nie byłyby one również uwzględnione w skrytce).
Kiedy najpierw wybrałem opcję „stage all”, a następnie ukryłem nowo dodane komponenty, które były śledzone, a zatem włączone do skrytki.
źródło
Kiedyś zastanawiałem się i pragną tej samej funkcji. Ale z czasem zauważyłem, że to naprawdę nie jest potrzebne. Podczas przechowywania możesz pozostawić nowe pliki. Nic „złego” nie może im się przytrafić (gdy sprawdzisz coś innego, git popełni błąd i nie zastąpi istniejącego nieśledzonego pliku)
A ponieważ zazwyczaj przedział czasowy między
git stash
igit stash pop
jest raczej niewielki, szybko będziesz potrzebować nieśledzonego pliku. Powiedziałbym więc, że niedogodności związane z wyświetlaniem plikugit status
podczas pracy nad czymś innym (międzygit stash
igit stash pop
) są mniejsze niż niedogodności spowodowane pracą i wymaganą uwagą, w przeciwnym razie próba dodania nieśledzonego pliku do twój zapas.źródło