Git #7  Stash czyli zapisywanie zmian​

Git #7 Stash czyli zapisywanie zmian

Poziom trudności
1.5/5

Przeskakiwanie pomiędzy gałęziami, może przysporzyć nam wiele stresu w przypadku gdy mamy już poczynione jakieś zmiany. Na szczęście twórcy Git’a, udostępniają nam mechanizm zapisu nieskomitowanych zmian. Stash (bo takiej komendy będziemy używać) oznacza dosłownie chowanie, choć w rzeczywistości jest to bardziej odkładanie czegoś na później. Odkładanymi rzeczami są w tym przypadku zmiany w kodzie. Stash jest stosem, na który zapisujemy kolejne „paczki” kodu.

Schowaj

Komenda git stash tymczasowo odkłada niezapisane zmiany, by móc swobodnie pracować nad czymś innym i mieć możliwość przywrócenia zapisanych wcześniej zmian w stash’u, w dowolnym momencie. Wykorzystuje się ją często, gdy nie chcemy jeszcze komitować kodu, gdyż jest niegotowy lub nie wiemy, czy w ogóle zostanie wciągnięty do repozytorium. Stwórz nowy plik lub zmiany w istniejącym pliku, a następnie użyj komendy git stash:

  1. pi@raspberrypi:~/undoing_changes $ git stash
  2. Saved working directory and index state WIP on master: 86b6857 Added file_one

W informacji zwrotnej otrzymujemy status pliku, nazwę gałęzi i komita, na jakim zostały dokonane zmiany. Należy jednak pamiętać, że git stash działa tylko lokalnie i nie jest przechowywany w żaden sposób w zdalnym repozytorium. Domyślnie Git „chowa” pliki, w których zaszły zmiany lub nowe pliki. Jeżeli chcemy, by pliki, które nie są brane pod uwagę przez repozytorium został dodane do stash’a, należy użyć argumentu -u lub –include-untracked. Gdy chcemy odłożyć na stos wszystkie edytowane pliki, włącznie z ignorowanymi -a lub -all.

Aby zmienić opis stash’a należy użyć argumentu save:

  1. pi@raspberrypi:~/undoing_changes $ git stash save "new name"
  2. Saved working directory and index state On master: new name

Listowanie zapisanych zmian

Jeśli chcemy uzyskać listę utworzonych stash’ów, dopisujemy dodatkowo argument list:

  1. pi@raspberrypi:~/undoing_changes $ git stash list
  2. stash@{0}: On master: new name
  3. stash@{1}: WIP on master: 86b6857 Added file_one

Dostajemy informacje o kolejnych staszach. Każda z linijek zawiera numer stasza i jego opis. Czym „zapis” jest nowszy, tym ma niższy numer, zaczynając od zera.

Różnice

Aby uzyskać informacje o schowanych plikach w stashu, należy użyć argumentu show. Jeżeli na tym poprzestaniemy, dostaniemy informacje o zmianach zapisanych w ostatnim stash’u:
  1. pi@raspberrypi:~/undoing_changes $ git stash show
  2. file_one.py | 1 +
  3. 1 file changed, 1 insertion(+)
Jednak, jeżeli chcemy uzyskać informacje o którymś z poprzednich stash’y, po argumencie show, dodaj jego numer lub nazwę (stash@{1}). Do uzyskania szczegółowych informacji o zmianach służy argument -p.
  1. pi@raspberrypi:~/undoing_changes $ git stash show -p stash@{1}
  2. diff --git a/13.py b/13.py
  3. new file mode 100644
  4. index 0000000..e69de29
  5. diff --git a/file_one.py b/file_one.py
  6. index e69de29..b61da71 100644
  7. --- a/file_one.py
  8. +++ b/file_one.py
  9. @@ -0,0 +1,3 @@
  10. +dfgsdf
  11. +sdgsdf
  12. +sdgsdff
  13. \ No newline at end of file
  14. (END)

Odzyskanie danych

Odzyskać dane, czyli inaczej, przywrócić je ze stasza do repozytorium można za pomocą git stash apply. Jeżeli dodany numer lub nazwę stasza zaciągniemy zmiany z wybranego schowka:

  1. pi@raspberrypi:~/undoing_changes $ git stash apply stash@{1}

Po takiej akcji, jeżeli nie wystąpią żadne konflikty, pliki ze schowka numer jeden, zostaną przywrócone, ale sam stash nie zostanie usunięty. Drugim sposobem zaciągania zmian ze stash’a jest użycie argumentu pop:

  1. pi@raspberrypi:~/undoing_changes $ git stash pop

Jego działanie nie różni się od apply z wyjątkiem tego, że po wykonaniu takiej komendy, gdy zmiany zostaną przywrócone do repozytorium, stash zostanie automatycznie usunięty.

Czyszczenie stash'a

Wyczyścić dane w stash’u także możemy na dwa sposoby. Aby usunąć pojedynczy zapis, wpisz:

  1. pi@raspberrypi:~/undoing_changes $ git stash drop 2
  2. Dropped refs/stash@{2} (8cfa6d563f8a9b59bc4e42169089a20c2e932793)

Jak widzimy na powyższym przykładzie, używamy do tego argumentu drop i numeru stash’a. Zamiast numeru możemy podać nazwę (stash@{1}) lub nie podawać nic, wtedy usuniemy zerowy stash.

Aby wyczyścić wszystkie pochowane zmiany, wystarczy nam argument clear:

  1. pi@raspberrypi:~/undoing_changes $ git stash clear

Schowek Git’a może okazać się bardzo pomocny, a na pewno pozwala oszczędzić nerwów, gdy niekoniecznie udane, lecz kluczowe zmiany mogą nam gdzieś „uciec”.

Dodaj komentarz