Stash
Stash jest mechanizmem przechowywania lokalnych zmian w sposób niepowiązany z bieżącym branchem czy też czasem dokonania zmian. Potrafi być bardzo użyteczny w przypadku prostych zmian, często wprowadzanych w naszym repozytorium lecz nigdy nie publikowanych zdalnie. Potrafi być za to zgubny gdy chcemy na nim polegać w trakcie przełączania się między zadaniami.
Przygotowanie repozytorium
Do celów tego modułu przygotujemy bardzo proste repozytorium z pewną historią. Wpierw przygotujmy samo repozytorium:
mkdir git-stash
cd git-stash
git init
Przygotujmy pierwszy commit:
touch README.md
git add README.md
git commit -m "Empty readme."
Oraz ten drugi:
echo '#README' > README.md
git add README.md
git commit -m "README header."
Zapis zmian
Po wprowadzeniu zmian w naszym repozytorium możemy je zobaczyć wykonując polecenie:
git diff
Aby zapisać nasze zmiany do przechowania i usunąć je z przestrzeni roboczej wystarczy wprowadzić polecenie:
git stash
Aby wypisać listę zmian zapisanych w przechowalni wykorzystamy polecenie:
git stash list
Posiadając identyfikator zmiany stash@{N} - gdzie N jest numerem porządkowym zmiany - możemy spowrotem nałożyć zmiany na naszą przestrzeń roboczą poleceniem:
git stash apply stash@{0}
Zmiana o identyfikatorze 0 została nałożona na naszą przestrzeń roboczą lecz nie została usunięta z przechowalni.
Do sprawdzenia zawartości zmiany w przechowalni pomocne jest polecenie:
git stash show -p stash@{0}
Do wprowadzenia zmiany wraz z usunięciem jej z przechowalni zamiast polecenia apply zastosujemy polecenie pop:
git stash pop stash@{0}
Aby zapisać zmiany z naszym własnym opisem możemy użyć następującego polecenia:
git stash save "Changes in README file."
Problemy
Mając w naszej przechowalni zapisaną zmianę w pliku README.md dokonajmy w nim zmiany także w przestrzeni roboczej. Teraz wykonując polecenie
git stash apply stash@{0}
Otrzymamy komunikat podobny do tego:
error: Your local changes to the following files would be overwritten by merge:
README.md
Please commit your changes or stash them before you merge.
Aborting
Jeśli w naszych zapisanych zmianach znajdowały się modyfikacje więcej niż jednego pliku - zmiany żadnego z nich nie zostaną zastosowane.
Analogicznie jeśli z naszej przestrzeni usuniemy plik, którego modyfikacja jest częścią wpisu - otrzymamy konflikt do rozwiązania:
CONFLICT (modify/delete): README.md deleted in Updated upstream and modified in Stashed changes. Version Stashed changes of README.md left in tree.