Команда git stash позволяет на время отложить изменения, сделанные в рабочей копии, чтобы вы могли применить их позже. Откладывание изменений полезно, если вам необходимо переключиться на другую ветку и вы пока не готовы к созданию коммита либо же если ваши изменения служат черновиком, к которому вы хотите потом вернуться.

Самый простой способ отложить изменения:

git stash

Команда создаёт временное хранилище - stash и помещает туда все локальные изменения с последнего коммита. Однако вокруг этой простой строки есть ряд других полезных команд, предоставляющих больше возможностей при подобных операциях.

Ниже рассмотрим несколько команд, позволяющих работать с git stash проще и углублённей.

git stash save

Эта команда похожа на git stash, но у неё есть разные опции.

Git stash с сообщением

git stash save "stash message"

Эта команда откладывает изменения с сообщением. Мы увидим позже, насколько это полезно.

Сохранение неотслеживаемых файлов

Наряду с изменёнными, вы также можете отложить в stash ещё неотслеживаемые файлы, т.е. новые.

git stash save -u

или

git stash save --include-untracked

git stash list

Прежде чем рассмотреть эту команду, коротко о том, как работает stash.

Когда вы сохраняете git stash или git stash save, Git фактически создает объект с некоторым именем, а затем сохраняет его в вашем репозитории локально.

Это означает, что вы можете просмотреть список созданных вами таких объектов в любое время. Осуществляется это с помощью команды:

git stash list

После мы увидим подобную картину:

Перед нами список всех созданных stash'ей. Последний сделанный stash находится cверху.

Обратите внимание, самый верхний stash содержит сообщение (которое мы задали командой git stash save "stash message").

git stash apply

Команда git stash apply берет самый верхний stash в стеке и применяет его к текущему репозиторию. В нашем случае это будет stash@{0}.

Однако если вы хотите применить какой-то другой stash, необходимо указать его идентификатор:

git stash apply stash@{1}

git stash pop

Эта команда очень похожа на команду git stash apply, но разница в том, что после применения stash'а она его удаляет из стека.

В нашем случае, если мы выполним git stash pop, а потом посмотрим на список наших stash'ей git stash list, мы увидим следующее:

Как видите, верхний stash применился и удалился, а stash@{0} обновился более старым по стеку.

Подобным образом, если вы хотите применить эту команду к какому-то конкретному stash'у, необходимо указать его идентификатор.

git stash pop stash@{1}

git stash show

Команда показывает список изменений в stash'е. Стоит также отметить, что отображаются изменения самого верхнего stash'а.

Увидим мы что-то вроде такого:

Если мы хотим увидеть полную информацию об изменениях, используем команду:

git stash show -p

По аналогии с предыдущими командами, чтоб посмотреть изменения другого stash'а, добавляем к команде его идентификатор:

git stash show stash@{1}

git stash branch <name>

Эта команда создает новую ветку с применением последнего stash'а, а затем удаляет его (как в stash pop).

Если вам нужен конкретный stash, вы можете указать его идентификатор.

git stash branch <name> stash@{1}

<name> - имя ветки.

Такая команда может быть полезна для случаев, когда вы сталкиваетесь с конфликтами после применения stash'а к последней версии вашей ветки.

git stash clear

Эта команда удаляет все stash'ы, сделанные в репозитории.

git stash drop

Эта команда удаляет последний stash в стеке. Как и предыдущую команду, используйте эту с предельной осторожностью. Вернуть удалённый stash довольно сложно, а иногда и невозможно.

Для удаления конкретного stash'а, добавляйте его идентификатор:

git stash drop stash@{1}