Ponieważ git zasadniczo polega na zarządzaniu całą zawartością i indeksem repozytorium (a nie jednym lub kilkoma plikami), git stash
zajmuje się, co nie dziwi,z całym katalogiem roboczym.
W rzeczywistości od wersji Git 2.13 (II kwartał 2017 r.) Można przechowywać poszczególne pliki za pomocą git stash push
:
git stash push [--] [<pathspec>...]
Gdy pathspec
podano „ git stash push
”, nowa skrytka rejestruje zmodyfikowane stany tylko dla plików, które pasują do specyfikacji ścieżki. Zobacz „Ukrywanie zmian w określonych plikach ”, aby uzyskać więcej.
Uproszczony przykład:
git stash push path/to/file
Przypadek testowy tej funkcji pokazuje kilka dodatkowych opcji:
test_expect_success 'stash with multiple pathspec arguments' '
>foo &&
>bar &&
>extra &&
git add foo bar extra &&
git stash push -- foo bar &&
test_path_is_missing bar &&
test_path_is_missing foo &&
test_path_is_file extra &&
git stash pop &&
test_path_is_file foo &&
test_path_is_file bar &&
test_path_is_file extra
Oryginalna odpowiedź (poniżej, czerwiec 2010 r.) Dotyczyła ręcznego wybierania tego, co chcesz ukryć.
Komentarze Casebash :
To ( stash --patch
oryginalne rozwiązanie) jest fajne, ale często modyfikowałem wiele plików, więc używanie łatki jest denerwujące
bukzor „s odpowiedź (upvoted, listopad 2011) sugeruje bardziej praktyczne rozwiązanie, oparte na
git add
+git stash --keep-index
.
Idź i poproś jego odpowiedź, która powinna być oficjalna (zamiast mojej).
O tej opcji chhh wskazuje w komentarzach alternatywny przepływ pracy:
powinieneś „ git reset --soft
” po takim skrytce, aby przywrócić czystą inscenizację:
Aby wrócić do pierwotnego stanu - który jest czystym obszarem inscenizacji i tylko z kilkoma wybranymi nieustawionymi modyfikacjami, można delikatnie zresetować indeks, aby uzyskać (bez popełnienie czegoś takiego jak ty - bukzor - zrobiłeś).
(Oryginalna odpowiedź z czerwca 2010: skrytka ręczna)
Jednak git stash save --patch
może pozwolić na osiągnięcie częściowego ukrywania, którego szukasz:
Za pomocą --patch
można interakcyjnie wybierać przystawki między różnicą między HEAD a działającym drzewem, które ma być ukryte.
Wpis skrytki jest skonstruowany w taki sposób, że jego stan indeksu jest taki sam jak stan indeksu repozytorium, a jego drzewo robocze zawiera tylko zmiany wybrane interaktywnie. Wybrane zmiany są następnie przywracane z twojego środowiska roboczego.
Spowoduje to jednak zapisanie pełnego indeksu (który może nie być tym, czego chcesz, ponieważ może on zawierać inne pliki już zindeksowane) oraz częściowego drzewa roboczego (które może wyglądać jak ten, który chcesz ukryć).
git stash --patch --no-keep-index
może być lepsze dopasowanie.
Jeśli --patch
nie działa, proces ręczny może:
W przypadku jednego lub kilku plików rozwiązaniem pośrednim byłoby:
- skopiuj je poza repozytorium Git
(w rzeczywistości eleotlecram proponuje ciekawą alternatywę )
git stash
- skopiuj je z powrotem
git stash
# tym razem ukryte są tylko te pliki, które chcesz
git stash pop stash@{1}
# zastosuj ponownie wszystkie modyfikacje plików
git checkout -- afile
# zresetuj plik do zawartości HEAD, przed wszelkimi lokalnymi modyfikacjami
Pod koniec tego dość uciążliwego procesu będziesz mieć tylko jeden lub kilka plików ukrytych.
git stash --keep-index
zachowuje indeks, ale ukrywa wszystko - zarówno w indeksie, jak i poza nim.