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.

results matching ""

    No results matching ""