Jak mogę ukryć określony plik?

1653

Jak mogę ukryć określony plik, pozostawiając inne aktualnie zmodyfikowane poza schowkiem, który zamierzam zapisać?

Na przykład, jeśli status git daje mi to:

younker % gst      
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   app/controllers/cart_controller.php
#   modified:   app/views/cart/welcome.thtml
#
no changes added to commit (use "git add" and/or "git commit -a")

i chcę przechowywać tylko app / views / cart / welcome.thtml, jak mam to zrobić? Coś takiego (ale oczywiście to nie działa):

git stash save welcome_cart app/views/cart/welcome.thtml
ynkr
źródło
57
Pytanie „możliwy duplikat” ma obecnie nieprawidłową odpowiedź oznaczoną jako zaakceptowaną.
Penguin Brian
6
możesz użyć git checkout -- filenamei przywrócić go do pierwotnego stanu.
visualex
7
@visualex to rzeczywiście przywróci to, ale nie ukryje
Jesper,
2
Komentarz Re Penguin Brian: Tak, zaakceptowana odpowiedź na pytanie o „możliwy duplikat” zawiera odnośniki do tego pytania dla ostatnich wersji git.
Mars
1
$ git stash - filename.ext
Linielson

Odpowiedzi:

2509

EDIT: Ponieważ git 2.13, jest polecenie, aby zapisać ścieżkę specyficzne dla skrytki: git stash push <path>. Na przykład:

git stash push -m welcome_cart app/views/cart/welcome.thtml

STARA ODPOWIEDŹ:

Możesz to zrobić za pomocą git stash --patch(lub git stash -p) - przejdziesz do trybu interaktywnego, w którym zobaczysz każdy zmieniony fragment. Użyj, naby pominąć pliki, których nie chcesz ukryć, ygdy napotkasz ten, który chcesz schować, oraz qwyjść i zostawić pozostałe porcje bez skrytki. aukryje pokazaną porcję i resztę porcji w tym pliku.

Nie jest to najbardziej przyjazne dla użytkownika podejście, ale działa, jeśli naprawdę tego potrzebujesz.

svick
źródło
32
Uciążliwe, ale działa. Żałuję, że nie ma szybkiego sposobu na przechowywanie tylko zmian etapowych, a następnie umieszczanie zmian w niestabilizowanym drzewie roboczym, gdy zostanie później wyświetlone.
James Johnston,
56
@JamesJohnston git stash --keep-indexpozwoli ci na przechowywanie wszystkich niestopionych zmian (przeciwieństwo tego, czego szukasz). stackoverflow.com/a/8333163/378253
nimser
123
Jeśli azamiast tego powiesz y, ukryje ten fragment + pozostałą część pliku, co jest znacznie szybsze.
i_am_jorf
53
@jeffamaphone świetnie! również dzrobi odwrotnie, tj. nie będzie przechowywać żadnych kolejnych porcji w bieżącym pliku. i rzeczywiście ?pokaże wszystkie możliwe opcje.
omnikron,
9
@Vencovsky To skrót od „wiadomość” i służy do określenia opcjonalnego opisu skrytki. Jeśli tego nie potrzebujesz, możesz pominąć tę -m welcome_cartczęść.
svick
336

Zwykle dodaję do indeksu zmiany, których nie chcę przechowywać, a następnie przechowuję z --keep-indexopcją.

git add app/controllers/cart_controller.php
git stash --keep-index
git reset

Ostatni krok jest opcjonalny, ale zwykle tego chcesz. Usuwa zmiany z index.


Ostrzeżenie Jak zauważono w komentarzach, wszystko trafia do schowka, zarówno w inscenizacji, jak i poza sceną. Po --keep-indexprostu zostawia indeks w spokoju po zakończeniu skrytki. Może to powodować konflikty scalania, gdy później otworzysz schowek.

skalee
źródło
5
Jest to znacznie lepsze niż zaakceptowana odpowiedź, jeśli masz dużo zmian, których nie chcesz przebrnąć przez opcję --patch.
quux00
181
Nie, to umieszcza wszystko w schowku, zarówno na scenie, jak i poza sceną. Po --keep-indexprostu zostawia indeks w spokoju po zakończeniu skrytki. Więc to nie jest poprawna odpowiedź na pytanie, AFAICT.
Raman
2
Zobacz moją odpowiedź na pytanie @ Rachel, aby
dowiedzieć
3
Następnie, jeśli chcesz odzyskać zapisane pliki bez zatwierdzania dodanych plików, możesz uruchomić git stash; git stash pop stash@{1}.
yndolok
8
OSTRZEŻENIE: Zwróć uwagę na punkt @ Ramana. To nie robi tego, co powinno. Spowoduje to umieszczenie tych samych zmian w skrytce i pozostawienie ich w drzewie roboczym. Kiedy później spróbujesz wyłowić skrytkę, prawdopodobnie pojawią się konflikty scalania, które często są naprawdę zagmatwane i trudne do naprawienia.
rjmunro
28

Aby dodać do odpowiedzi Svicka, -mopcja po prostu dodaje wiadomość do twojego skrytki i jest całkowicie opcjonalna. Tak więc polecenie

git stash push [paths you wish to stash]

jest całkowicie poprawne. Na przykład, jeśli chcę tylko przechowywać zmiany w src/katalogu, mogę po prostu uruchomić

git stash push src/
qiu
źródło